【问题标题】:Hibernate: Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to <package.Class>休眠:引起:java.lang.ClassCastException:[Ljava.lang.Object;不能转换为 <package.Class>
【发布时间】:2015-06-21 18:26:11
【问题描述】:

我无法从数据库中获取数据并将其转换为我需要的类型。

我尝试使用 Spring 安全性从数据库中窃取注册用户。 它的工作原理如下:我从UserDetailsServiceImpl 插入用户名和密码以及方法loadUserByUserName(String userName) 类进入数据库并检查用户是否存在于数据库中,如果是(用户存在于数据库中)然后从数据库中获取它并授权用户和为他呈现安全页面。但问题是在我的 DAO impl 类方法中不能将它转换为需要我的对象 - App1User 我的实体类,我在登录页面上看到这样的消息(原因:[Ljava.lang.Object; 不能转换为 app1 .domain.App1Userenter 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");
        }

    }

【问题讨论】:

    标签: java spring hibernate spring-security


    【解决方案1】:

    当你从 DB 中选择特定的列时,你得到的结果不是实体对象,而是一个Object[],数组的每个元素都持有不同的列值。所以,你从query.list() 方法得到的是:List&lt;Object[]&gt;。所以,当然,当你将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], ...);
    

    当然不是最好的方法。更好的方法是从 db 获取List&lt;App1User&gt;。为此,只需将查询更改为:

    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";
    

    【讨论】:

    • 这已经停止了。请告诉我它与 HQL 有关如何休眠从 DB 中选择数据,这是我需要阅读的内容,对吗?
    • @java_user 是的。您可以阅读有关此的 Hibernate 文档。
    • 这对我有帮助。我更改了 sql 查询,它运行良好。谢谢@RohitJain
    猜你喜欢
    • 1970-01-01
    • 2018-06-25
    • 2015-10-18
    • 2014-05-09
    • 2015-02-01
    • 1970-01-01
    • 2021-07-19
    • 2016-07-23
    • 1970-01-01
    相关资源
    最近更新 更多