简体   繁体   English

休眠:原因:java.lang.ClassCastException:[Ljava.lang.Object; 无法投射到 <package.Class>

[英]Hibernate: Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to <package.Class>

I have problem to fetch data from database and cast it to me needed type. 我从数据库中获取数据并将其强制转换为我需要的类型时遇到问题。

I try to cheak for the regestered user from database using Spring security. 我尝试使用Spring Security从数据库中为已废弃的用户进行检查。 It works like: I insert userName and password and method loadUserByUserName(String userName) from UserDetailsServiceImpl class goes to database and cheaks for is the user exist in DB and if yes(user exist in DB) then fetch it from DB and authorize the user and render for him secure page. 它的工作原理是:我插入用户名和密码,然后将UserDetailsServiceImpl类的loadUserByUserName(String userName)方法转到数据库,并检查用户是否存在于DB中,如果是(用户存在于DB中),则从DB中获取它并授权该用户,为他呈现安全页面。 But problem is the in my DAO impl class method can't cast it to need me object - App1User my entity class and I see on login page message like this(Reason: [Ljava.lang.Object; cannot be cast to app1.domain.App1User enter code here ): 但是问题是我的DAO impl类方法无法将其App1User为需要我的对象App1User我的实体类,并且我在登录页面上看到这样的消息(原因:[Ljava.lang.Object;无法转换为app1.domain .App1User enter code here ):

My method in DAOImpl class: 我在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);
    }

My hibernate.hbm.xml 我的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>

The exception I have right now: 我现在有一个例外:

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

And also my UserDetailServiceImpl class: 还有我的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");
        }

    }

When you select specific columns from DB, the result you get is not the entity object, but an Object[] , with each element of array holding different column values. 当从数据库中选择特定列时,得到的结果不是实体对象,而是Object[] ,数组的每个元素持有不同的列值。 So, what you're getting from query.list() method is: List<Object[]> . 因此,您从query.list()方法获得的是: List<Object[]> So, certainly when you cast list.get(0) , to App1User , that will result in ClassCastException . 因此,当您将list.get(0)App1User ,肯定会导致ClassCastException

So, either you get the Object[] and build the App1User entity object like this: 因此,要么获得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], ...);

Certainly not the best way. 当然不是最好的方法。 Better approach is to get a List<App1User> from db. 更好的方法是从db获取List<App1User> For that just change the query from: 为此,只需将查询从:

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

to: 至:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Hibernate java.lang.ClassCastException [Ljava.lang.Object; 不能投射到我的 class - Hibernate java.lang.ClassCastException [Ljava.lang.Object; cannot be cast to my class java.lang.ClassCastException:[Ljava.lang.Object; 无法投射到 - java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.lang.ClassCastException:[Ljava.lang.Object; 无法投射到 - java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to 原因:mpi.MPIException:java.lang.ClassCastException:无法强制转换为[Ljava.lang.Object; - Caused by: mpi.MPIException: java.lang.ClassCastException: cannot be cast to [Ljava.lang.Object; Hibernate:java.lang.ClassCastException:[Ljava.lang.Object; 无法强制转换为database.entity.Dokumenty - Hibernate: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to database.entity.Dokumenty java.lang.ClassCastException:class [Ljava.lang.Object; 不能转换为 class - java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class java.lang.ClassCastException:[Ljava.lang.Object; 无法转换为[Ljava.lang.Comparable; - java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable; 特殊场景:java.lang.ClassCastException: [Ljava.lang.Object; 不能转换为 [Ljava.lang.String; - Special Scenario : java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String; java.lang.ClassCastException: [Ljava.lang.Object; 不能转换为 [Ljava.lang.String; - java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String; IAM获取原因:java.lang.ClassCastException:[Ljava.lang.Object; 无法转换为retail.model.vo.Book - iam getting Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to retail.model.vo.Book
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM