相同的类进行强转出现ClassCastException异常

相同的类进行强转出现ClassCastException异常

Scroll Down

发现问题

接手一个项目,该项目内嵌了一个nginx,我运行该项目后出现了一些问题,后续进行debug时发现Session实例类型是OnlineSession强转OnlineSession时竟然出现java.lang.ClassCastException。

具体分析

部分代码如下:

HttpCookie httpCookie = httpCookieOptional.get();
Session session =  onlineWebSessionManager.getSession(httpCookie.getValue());
OnlineSession onlineSession = (OnlineSession) session;

这里的session实现类是OnlineSession,却不能进行强转,我分别打印了他们的ClassLoader,ClassLoader居然不是同一个!!!

来先看一组图(如果看不清,请点击这里图片
classloader

上面两张图是开启了热部署,下面两张图是关闭了热部署

对,你发现了,上面两张图虽然都是相同的ClassLoader,但不是同一个实例
下面两张图是相同实例

为什么会出现这种问题

正常情况下强转成功是毋庸置疑的,出现这种情况一般是ClassLoader类加载器的不同导致的类型转换异常

在本文项目是因为开启了热部署导致的。

如何解决

只需要在application.yml中将spring.devtools.restart.enabled设置为false。

spring:
  devtools:
    restart:
      enabled: false  # 热部署开关

或者将如下依赖进行注释

     <dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-devtools</artifactId>
     </dependency>

其他解决办法

  1. 重新new一个对象,然后使用反射获取值,set进去
  2. json序列化再反序列化
  3. 在resources目录下面创建META-INF文件夹,然后创建spring-devtools.properties文件,文件加上类似如下配置 (由于我是多模块项目,使用idea启动,模块未打包成jar,所以该方法未测试)
restart.exclude.companycommonlibs=/mycorp-common-[\\w.]+.jar 
restart.include.projectcommon=/mycorp-myproj-[\\w.]+.jar