美文网首页
SpringBoot devtools导致类型转换异常

SpringBoot devtools导致类型转换异常

作者: 走在成长的道路上 | 来源:发表于2019-12-18 14:04 被阅读0次

最近使用 springbootnetty 进行中间件开发,其中出现很奇怪的问题,同样的 Class 在做 foreach 的过程中出现 ClassCastException ,具体异常如下:

java.lang.ClassCastException: com.xxx..entities.SyncSubscribe cannot be cast to com.xxx.entities.SyncSubscribe
    at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_191]
    at com.xxx.services.impl.SyncServiceImpl.sendPublishMessage(SyncServiceImpl.java:252) ~[classes/:na]
    at com.xxx.services.impl.SyncServiceImpl.processPublish(SyncServiceImpl.java:208) ~[classes/:na]
    at com.xxx.server.handlers.MqttHandler.channelRead0(MqttHandler.java:45) ~[classes/:na]
    at com.xxx.server.handlers.MqttHandler.channelRead0(MqttHandler.java:23) ~[classes/:na]
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99) ~[netty-all-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) [netty-all-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) [netty-all-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) [netty-all-4.1.43.Final.jar:4.1.43.Final]
    at com.xxx.server.handlers.MqttExceptionHandler.channelRead(MqttExceptionHandler.java:30) [classes/:na]

在调试过程中,发现如下现象:

同一类不同ClassLoader问题

如上图所示,两个类名称完全一样,均为自定义实体,当两个类型在不同的 ClassLoader 中,导致 java.lang.ClassCastException 问题。

项目启动时加载项目中的类使用的加载器都是
org.springframework.boot.devtools.restart.classloader.RestartClassLoader
而从 session 取出来的对象的类加载器都是 sun.misc.Launcher.AppClassLoader 很明显会导致类型转换异常,原来Spring的dev-tools为了实现重新装载class自己实现了一个类加载器,来加载项目中会改变的类,方便重启时将新改动的内容更新进来。因此,导致上述内容产生 ClassCastException

解决方案

共有两个解决方案,如下所示:

  1. 不使用 spring-boot-devtools 做热部署

  2. resources 目录下面创建 META-INF 文件夹,然后创建 spring-devtools.properties 文件,文件加上类似下面的配置:

restart.exclude.xxxcommonlibs=/xxxx-[\w-]+.jar
restart.include.projectcommon=/xxxx-[\w-]+.jar

即,将其依赖库均导入到 devtools 库中

相关文章

网友评论

      本文标题:SpringBoot devtools导致类型转换异常

      本文链接:https://www.haomeiwen.com/subject/rfqunctx.html