最近在做一个sb+tkmybatis整合的可以提供通用数据操作接口的demo,然而出现了很诡异的事情.,使用mapper提供的selectByPrimaryKey接口返回结果时报异常:
java.lang.ClassCastException: com.yhq.ssmdemo.web.mysql.pojo.Tree cannot be cast to com.yhq.ssmdemo.web.mysql.pojo.Trees
...什么鬼?自己转换自己?还报异常?搞了一整天都不知道怎么回事,去看mybatis源码,mapper源码,都没发现会造成这种问题的代码..然后在另外一个不用springboot的demo里面试了却不会出现这种问题。然后我又开始研究是不是spring boot自动配置时少了某些东西,但也没发现,而且也不会是这种问题吧...然后后面上网搜了下(之前也搜过,但可能关键字不准确导致搜出来的没有想要的结果),然后发现了一个同样的问题,说这是工具造成的一个bug,但我还以为是mapper工具,看了他给出的解决方案然后才知道是spring devtools这个工具。由于是本地开发的,所以用了spring devtools工具来进行监测代码修改自动重启,我们知道这个工具的原理就是使用两个类加载器,一个加载不会改变的第三方的依赖jar;另一个加载自己项目中自己编写的类。所以会出现这个异常就是由于这个问题导致的,下面上图,这样可以更加清晰直观地看出来,
这个是在项目启动spring devtools模块时进行堆dump的图,可以看到我自己写的许多类都有两个:
这个是项目不启用spring devtools模块的堆dump图,自己写的类只有一个:
所以这完全就是spring devtools的使用导致的,那怎么解决呢?让同一个类加载器去加载mapper的jar和自己写的实体类就行了:
在项目的src/main/resources目录下新建一个目录:META-INF,然后新建一个spring-devtools.properties文件,内容为:restart.include.companycommonlibs=tk/mybatis.*即可。
原文地址:https://www.cnblogs.com/fakerblog/p/8406872.html