Jfinal3.5 java.lang.String cannot be cast to [Ljava.lang.Object问题

我的环境,jdk1.8.0.202,jfinal3.5.

使用代码:

String pk = object.getPk();
String pkValue = record.get(pk).toString();
   // 删除数据
Db.use(object.getDs()).delete(object.getTable(), pk, record);

到这一行就报错了:

java.lang.ClassCastException: java.lang.String cannot be cast to [Ljava.lang.Object;
	at com.jfinal.plugin.activerecord.DbPro.delete(DbPro.java:461)
	at com.eova.widget.grid.GridController$2.run(GridController.java:282)
	at com.jfinal.plugin.activerecord.DbPro.tx(DbPro.java:770)
	at com.jfinal.plugin.activerecord.DbPro.tx(DbPro.java:807)
	at com.eova.widget.grid.GridController.deleteOrHide(GridController.java:260)
	at com.eova.widget.grid.GridController.delete(GridController.java:236)
	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:498)
	at com.jfinal.aop.Invocation.invoke(Invocation.java:75)
	at com.eova.interceptor.AuthInterceptor.intercept(AuthInterceptor.java:71)
	at com.jfinal.aop.Invocation.invoke(Invocation.java:69)
	at com.eova.interceptor.LoginInterceptor.intercept(LoginInterceptor.java:81)
	at com.jfinal.aop.Invocation.invoke(Invocation.java:69)
	at com.jfinal.core.ActionHandler.handle(ActionHandler.java:81)
	at com.jfinal.ext.handler.UrlSkipHandler.handle(UrlSkipHandler.java:46)
	at com.jfinal.ext.handler.UrlSkipHandler.handle(UrlSkipHandler.java:46)
	at com.jfinal.plugin.druid.DruidStatViewHandler.handle(DruidStatViewHandler.java:81)
	at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:86)
	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:956)
	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:625)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2522)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2511)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

请教一下原因。

另外,这些代码之前是在jdk1.7环境下使用的,一直没有问题,最近把jdk升级到1.8之后才出现的上述问题。



评论区

JFinal

2019-01-24 11:27

这个问题得到了确证,是 JKD 1.8 的问题,目前 jfinal 3.6 已经对此做了适配性调整,但 jfinal 3.6 要过几天才能发布

目前建议的解决办法如下:
1:改用 deleteById,例如:Db.deleteById("user", "id", record.getInt("id"));
2:使用线上最新版本: git@gitee.com:jfinal/jfinal.git
线上最新版本使用下面的办法安装到本地:
git clone git@gitee.com:jfinal/jfinal.git
cd jfinal
mvn clean install
安装完成后,项目中的 3.5 版本号改成 3.6-SNAPSHOT

以上两个办法,两者选其一就可以。

Db 工具类中有很多可选方法可以使用,有两个方法会由 JDK 1.8 产生问题,换成别的方法代替就可以解决了。

过几天会发布 jfinal 3.6

hnzzhb

2019-01-24 15:19

收到,谢谢。

JFinal

2019-01-31 01:26

jfinal 3.6 已发布到 maven 中心库,升级后完美解决

hnzzhb

2019-01-31 10:54

@JFinal 收到,辛苦了!

巨轮深港啊

2019-12-11 16:42

@JFinal 我用的4.7 依然出现这个问题了 所以我搜索到了这里..

巨轮深港啊

2019-12-11 16:43

@巨轮深港啊 getInt("category_id")报这个错 category_id在数据库中是11位int型

JFinal

2019-12-11 17:55

@巨轮深港啊 单步调试进入方法内部,看调用的哪个方法

巨轮深港啊

2019-12-11 20:20

@JFinal 解决了 ,代码写的有问题,内存溢出,..

dgood

2020-05-21 21:25

@JFinal 具体是什么原因出现的这个问题 1.8 相比1.7 对于jfinal 有什么其他不支持的地方吗

JFinal

2020-05-21 21:29

@dgood 这个是 JDK 内部细节的问题, JDK 1.8 相对于之前的版本是大版本升级,所以这个版本并不会完全兼容原来的用法

在 jfinal 层面,升到 JDK 1.8 时并没有改动这里的任何代码,换句话说,这个兼容性问题肯定是与 jfinal 无关的

热门反馈

扫码入社