spring boot+tkmybatis(mapper)工具实现通用数据操作接口时遇到的问题

Posted fakerblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot+tkmybatis(mapper)工具实现通用数据操作接口时遇到的问题相关的知识,希望对你有一定的参考价值。

最近在做一个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.*即可。

 

 


以上是关于spring boot+tkmybatis(mapper)工具实现通用数据操作接口时遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章

spring boot+tkmybatis(mapper)工具实现通用数据操作接口时遇到的问题

TKMybatis

如何查看spring boot url mapping

spring boot为啥引入两个mapping会报错

spring boot的map怎么创建

如何使用Spring Boot在Map中加载属性?