java.lang.ClassCastException: java.lang.String cannot be cast to [C Java.lang.ClassCastException: Java.lang.String无法转换为[C

3
我正在使用以下代码将char[]转换为字符串,但是它会抛出以下错误:

java.lang.ClassCastException: java.lang.String无法转换为[C

char[] charArray = user.getUserPassword();  
String userPassword = String.valueOf(charArray);

这里user.getUserPassword()返回的是char[]类型。我还尝试了以下方法:

String userPassword = new String(charArray);

但是它也抛出了相同的异常。(我使用的是java 8。)

完整的堆栈跟踪:

java.lang.ClassCastException: java.lang.String cannot be cast to [C
at org.hibernate.type.descriptor.java.PrimitiveCharacterArrayTypeDescriptor.unwrap(PrimitiveCharacterArrayTypeDescriptor.java:40)
at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor$1.doBind(VarcharTypeDescriptor.java:64)
at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:90)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:286)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:281)
at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:67)
at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:616)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1901)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1862)
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839)
at org.hibernate.loader.Loader.doQuery(Loader.java:910)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355)
at org.hibernate.loader.Loader.doList(Loader.java:2554)
at org.hibernate.loader.Loader.doList(Loader.java:2540)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)
at org.hibernate.loader.Loader.list(Loader.java:2365)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
at com.humworld.ccs.daoimpl.UserDAOImpl.login(UserDAOImpl.java:29)
at com.humworld.ccs.serviceimpl.UserServiceImpl.login(UserServiceImpl.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
at com.sun.proxy.$Proxy37.login(Unknown Source)
at com.humworld.ccs.controller.LoginController.loginAuthentication(LoginController.java:69)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:871)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:957)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2476)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2465)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)

这是UserDAOImpl类;

@Repository("userDAO")
public class UserDAOImpl implements UserDAO{

@Autowired
private SessionFactory sessionFactory;

@SuppressWarnings("unchecked")
@Override
public List<Object[]> login(String UserName, String UserPassword) {

    Session session = sessionFactory.openSession();
    String hql = HqlConstant.UserQuery;
    Query query = session.createQuery(hql);
    query.setParameter("UserName", UserName);
    query.setParameter("UserPassword", UserPassword);
    List<Object[]> list = query.list();

    session.close();
    return list;
}
}

这是HQL查询;
from UserModel um inner join um.userRoleModel where um.UserName = :UserName and um.UserPassword = :UserPassword 

3
如果user.getUserPassword()返回一个字符串,那么这个异常会有意义-请发布带有该方法的User类的代码。 - Jan
如果我是你,我会再次检查 user.getUserPassword() 的签名。 - NilsH
同时,追踪这个问题可能有必要记录行号(异常/代码)。 - Jan
请提供完整的堆栈跟踪以获取快速和正确的答案。 - Kamidu
是的,我正在使用varchar()作为密码,我应该使用什么替代它,是char()吗? - karthi
显示剩余7条评论
5个回答

4

我的理论是:

你把一个 String 放入

 query.setParameter("UserPassword", UserPassword);

但是

正如您所说,您的用户对象的userPassword属性的类型为char[]

现在,Hibernate是一个非常聪明的工具 - 它会识别userPassword的对象类型为char[],然后尝试将其设置到生成的查询中。但是,您传递了一个String

尝试这个:

   query.setParameter("UserPassword", UserPassword.toCharArray());

在你的登录方法中。

0
尝试使用以下代码: ```java String userPassword = new StringBuilder() .append(user.getUserPassword()).toString(); ```

这也会抛出相同的异常。 - karthi
它不能解决问题,因为问题与从“String”到“char []”的转换有关,而不是相反。 - user902383

0
如果你想将一个字符串转换成字符(数组,我猜测),我使用了一个for循环。
for (int i = 0; i < length; i++) {
  char[i] Letter = message1.charAt(i);
}

这是从我的旧代码中派生出来的,但这仍应将字符串message1转换为字符数组... 告诉我这是否有帮助:P


0

试试这个:

String result=String.copyValueOf(charArray);

这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - madhead
@madhead:这不是一个答案吗?它试图直接解决OP报告的错误。投票保留此答案。 - gariepy

-1

我遇到了类似的问题:

java.lang.ClassCastException: java.lang.String cannot be cast to [C

在这一行中

commons.validateException(String.valueOf(response.getBody().path("code")),
    String.valueOf(response.getBody().path("message"))

添加 .toString() 解决了这个问题。以下是代码行。
commons.validateException(String.valueOf(response.getBody().path("code").toString()), 
    String.valueOf(response.getBody().path("message").toString())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接