2015-04-15 1 views
0

У меня есть проблема с получением данных из базы данных и приведение их ко мне необходимым типом.Hibernate: Caused by: java.lang.ClassCastException: [Ljava.lang.Object; не может быть применено к <package.Class>

Я пытаюсь обмануть зарегистрированного пользователя из базы данных, используя Spring security. Он работает как: я вставляю имя пользователя и пароль, а метод loadUserByUserName(String userName) от UserDetailsServiceImpl класс переходит в базу данных и обманывает, поскольку пользователь существует в БД, и если да (пользователь существует в БД), то извлеките его из БД и авторизуйте пользователя и сделайте для него защищенной страницы. Но проблема в том, что мой метод класса DAO impl не может использовать его для моего объекта - App1User мой класс сущности, и я вижу сообщение на странице входа в систему, как это (Причина: [Ljava.lang.Object; не может быть добавлен в app1.domain .App1User enter code here):

Мой метод в классе DAOImpl:

public App1User findUserByName(String userName) { 


     Session session = sessionFactory.openSession(); 
     Transaction transaction = session.beginTransaction(); 
     List<App1User> listUser = null; 


     try { 

      String stringSQL = "select au.userId, au.firstName, au.lastName, au.middleName, au.username, au.password, au.userPosition from App1User au where au.username = :userNameArg"; 
      Query query = session.createQuery(stringSQL); 
      query.setParameter("userNameArg", userName); 

      listUser = (List<App1User>)query.list(); 

      session.flush();  
      session.clear(); 
      transaction.commit(); 

     } catch(HibernateException e) { 

      System.err.println(e); 

      if(transaction != null) 
       transaction.rollback(); 

     } finally { 
      if(session != null) 
       session.close(); 
     } 

     return (App1User)listUser.get(0); 
    } 

Мой hibernate.hbm.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration SYSTEM 
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

<hibernate-configuration> 

    <session-factory> 

     <property name="hibernate.current_session_context_class">thread</property> 

     <property name="hibernate.default_schema">PUBLIC</property> 

     <!-- JDBC connection pool (use the built-in) --> 
     <property name="connection.pool_size">1</property> 

     <property name="hibernate.transaction.auto_close_session">false</property> 

     <!-- SQL dialect --> 
     <property name="dialect">org.hibernate.dialect.H2Dialect</property> 

     <!-- Disable the second-level cache --> 
     <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property> 

     <!-- Echo all executed SQL to stdout --> 
     <property name="show_sql">true</property> 

     <!-- Drop and re-create the database schema on startup --> 
     <property name="hbm2ddl.auto">create</property> 

     <mapping resource="/WEB-INF/hibernateConf/App1User.hbm.xml"/> 

    </session-factory> 

</hibernate-configuration> 

исключение я прямо сейчас:

SEVERE: An internal error occurred while trying to authenticate the user. 
org.springframework.security.authentication.InternalAuthenticationServiceException: [Ljava.lang.Object; cannot be cast to app1.domain.App1User 
    at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:125) 
    at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:143) 
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:167) 
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:192) 
    at org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:93) 
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:217) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:120) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:120) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:53) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:91) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) 
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1517) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1474) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to app1.domain.App1User 
    at app1.persistance.UserManageDAOImpl.findUserByName(UserManageDAOImpl.java:102) 
    at app1.web.authentification.UserDetailsServiceImpl.loadUserByUsername(UserDetailsServiceImpl.java:36) 
    at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:114) 
    ... 42 more 

А также мой UserDetailServiceImpl класс:

public UserDetails loadUserByUsername(String userName) 
               throws UsernameNotFoundException { 


     App1User listUser = userManageDAOIF.findUserByName(userName); 
     String password = null; 
     Collection<GrantedAuthority> authorities = null; 

     if(listUser != null) { 

       password = (String)listUser.getPassword(); 

       authorities = new ArrayList<GrantedAuthority>(); 

        authorities.add(new SimpleGrantedAuthority("ROLE_USER")); 


       org.springframework.security.core.userdetails.User secureUser = new 
         org.springframework.security.core.userdetails.User(userName, password, authorities); 

       return secureUser; 

     } else { 

      throw new UsernameNotFoundException("No user exist in datbase"); 
     } 

    } 

ответ

3

При выборе определенных столбцов из БД, в результате вы получите не объект сущности, но Object[], с каждым элементом массива, содержащего различные значения столбцов. Итак, что вы получаете от метода query.list(): List<Object[]>. Итак, конечно, когда вы набрали list.get(0), до App1User, что приведет к ClassCastException.

Итак, как вы получите Object[] и построить объект App1User сущностей, как это:

// size of this array would be number of columns in select query 
Object[] attr = listUser.get(0); 
App1User appUser = new App1User(attr[0], attr[1], attr[2], ...); 

Конечно, не самый лучший способ. Лучший подход - получить List<App1User> от db. Для этого просто изменить запрос от:

String stringSQL = "select au.userId, au.firstName, au.lastName, au.middleName, au.username, au.password, au.userPosition from App1User au where au.username = :userNameArg"; 

к:

String stringSQL = "select au from App1User au where au.username = :userNameArg"; 
+0

Это halped. Скажите, пожалуйста, что это связано с HQL, как hibernate выбирает данные из БД, что мне нужно читать? –

+1

@java_user Да. Вы можете прочитать документы Hibernate об этом. –

+0

Это помогло мне. Я изменил sql-запрос, и он отлично работал. Спасибо @RohitJain – Ruthwik

Смежные вопросы