解决tk mapper 通用mapper的bug问题


Posted in Java/Android onJune 16, 2021

如下所示:

<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.isea533.mybatis.mapper"/>
            <property name="properties">
                <value>
                    mappers=tk.mybatis.mapper.common.Mapper
                </value>
            </property>
        </bean>

basePackage的属性值 不能包含通用mapper所在的包

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2018-03-14 12:39:21.741 ERROR [main] [hio-sys] o.s.boot.SpringApplication - Application startup failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'tk.mybatis.mapper.autoconfigure.MapperAutoConfiguration': Invocation of init method failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'baseMapper' defined in file []: Invocation of init method failed; nested exception is tk.mybatis.mapper.MapperException: tk.mybatis.mapper.MapperException: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:137)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:409)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1620)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
    at org.springframework.context.support.AbstractApplicationContext.__refresh(AbstractApplicationContext.java:543)
    at org.springframework.context.support.AbstractApplicationContext.jrLockAndRefresh(AbstractApplicationContext.java)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
    at com.jzy.hio.HioSysApplication.main(HioSysApplication.java:35)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'baseMapper' defined in file [C:\Users\coffee\OneDrive\workspace\v2r1-hio-base\target\classes\com\jzy\hio\base\mapper\BaseMapper.class]: Invocation of init method failed; nested exception is tk.mybatis.mapper.MapperException: tk.mybatis.mapper.MapperException: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType_jrOrig(DefaultListableBeanFactory.java:519)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType_jrOrig(DefaultListableBeanFactory.java:508)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java)
    at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1188)
    at tk.mybatis.mapper.autoconfigure.MapperAutoConfiguration.addPageInterceptor(MapperAutoConfiguration.java:71)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.__invoke(DelegatingMethodAccessorImpl.java:43)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:366)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:311)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:134)
    ... 18 common frames omitted
Caused by: tk.mybatis.mapper.MapperException: tk.mybatis.mapper.MapperException: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
    at tk.mybatis.mapper.mapperhelper.MapperHelper.setSqlSource(MapperHelper.java:248)
    at tk.mybatis.mapper.mapperhelper.MapperHelper.processConfiguration(MapperHelper.java:311)
    at tk.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:54)
    at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
    ... 39 common frames omitted
Caused by: tk.mybatis.mapper.MapperException: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
    at tk.mybatis.mapper.mapperhelper.MapperTemplate.setSqlSource(MapperTemplate.java:258)
    at tk.mybatis.mapper.mapperhelper.MapperHelper.setSqlSource(MapperHelper.java:245)
    ... 44 common frames omitted
Caused by: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
    at tk.mybatis.mapper.mapperhelper.MapperTemplate.getEntityClass(MapperTemplate.java:290)
    at tk.mybatis.mapper.provider.base.BaseSelectProvider.selectOne(BaseSelectProvider.java:50)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.__invoke(DelegatingMethodAccessorImpl.java:43)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at tk.mybatis.mapper.mapperhelper.MapperTemplate.setSqlSource(MapperTemplate.java:246)
    ... 45 common frames omitted

(通用mapper)项目升级通用Mapper引发的一连串问题以及问题解决

项目环境

通用Mapper版本

<dependency>
  <groupId>tk.mybatis</groupId>
  <artifactId>mapper-spring-boot-starter</artifactId>
  <version>1.1.5</version>
 </dependency>

Spring boot版本

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>1.5.9.RELEASE</version>
  <relativePath />
 </parent>

公司统一封装了三个核心包(kemean-aid、kemean-third、kemean-web),平时技术开发都是把三核心包下载源码到本地启动运行,这个星期把三个核心包打包成jar,让项目依赖jar启动,但启动的时候报了一个maven错误(问题一)。

问题一

Caused by: java.lang.LinkageError: loader constraint violation: loader (instance of org/springframework/boot/devtools/restart/classloader/RestartClassLoader) previously initiated loading for a different type with name "tk/mybatis/mapper/common/Mapper"

maven报了一个重复引用通用Mapper Jar错误,但反复查看maven引用,并没有发现有重复引用通用Mapper jar包,而且项目引用源码启动是正常运行的,这个问题着实报得有点诡异!因为经验问题,重复就maven报的这个问题寻找重复引用的jar,然而处理了很久也并没有解决。后来查看通用mapper的版本maven仓库(https://mvnrepository.com/artifact/tk.mybatis/mapper-spring-boot-starter) ,发现公司现在使用的版本已经更新好多个版本了,第一直觉认为是公司用的1.1.5这个版本有问题,于是乎升级了通用mapper版本到2版本(当前最新2.0.4),就这样掉大坑了,开始一系列的问题解决的路程。

<dependency>
     <groupId>tk.mybatis</groupId>
     <artifactId>mapper-spring-boot-starter</artifactId>
     <version>2.0.4</version>
 </dependency>

以下的问题都是在2版本的通用mapper中遇到的

问题二

tk.mybatis.mapper.MapperException: 无法获取实体类com.kemean.bean.KemeanAdminUser对应的表名!

github也有此问题的讨论:https://github.com/abel533/MyBatis-Spring-Boot/issues/18

问题解决

修改启动类@MapperScan注解

2版本的通用Mapper提供了@MapperScan注解,之前我们使用的是org.mybatis.spring.annotation.MapperScan,现需把@MapperScan改为tk.mybatis.spring.annotation.MapperScan

添加spring-devtools.properties文件

在项目src/main/resources目录新建一个文件夹META-INF(项目右键-new-Source Folder),添加热部署配置文件spring-devtools.properties,在文件里面添加restart.include.companycommonlibs=tk/mybatis.*

问题三

tk.mybatis.mapper.MapperException: tk.mybatis.mapper.provider.EmptyProvider中缺少selectOne方法!

github也有此问题的讨论:

https://github.com/abel533/MyBatis-Spring-Boot/issues/92

https://github.com/abel533/MyBatis-Spring-Boot/issues/53

问题解决:把项目热部署去掉

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

在处理完问题二、三,通用Mapper就升级成功了,项目也能够正常启动访问,但是,咱们在处理问题三的时候,把spring boot的热部署给去掉了,这就意味着咱们日后每改动一点,都需要重新启动部署服务,这是士可忍,叔不可忍;叔可忍,婶也不能忍的操作啊。

尝试过好多方式,都不能“升级通用mapper2版本”与“保留Spring boot热部署”两个兼得,后来看到这哥们的一句话,给了我一个提醒,于是乎在刚才添加的spring-devtools.properties文件再补充一行restart.include.companycommonlibs=kemean.*

spring-devtools.properties内容(kemean.*是公司jar的前缀)

restart.include.companycommonlibs=tk/mybatis.*
restart.include.companycommonlibs=kemean.*

https://github.com/abel533/MyBatis-Spring-Boot/issues/53

解决tk mapper 通用mapper的bug问题

再启动服务,服务正常使用,热部署也能够保留

问题一的最终解决

结合问题三的解决思路,那么咱们在不升级通用mapper的前提下,让项目依赖打包出来的jar运行,则仅需在

项目src/main/resources目录新建一个文件夹META-INF(项目右键-new-Source Folder),添加热部署配置文件spring-devtools.properties,在文件里面添加

restart.include.companycommonlibs=kemean.*

问题一就在不升级通用mapper下完美解决了~

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Java/Android 相关文章推荐
教你用Java Swing实现自助取款机系统
Jun 11 Java/Android
Java内存模型之happens-before概念详解
Jun 13 Java/Android
Spring Cache和EhCache实现缓存管理方式
Jun 15 Java/Android
Java并发编程之Executor接口的使用
Jun 21 Java/Android
Spring boot应用启动后首次访问很慢的解决方案
Jun 23 Java/Android
简单总结SpringMVC拦截器的使用方法
Jun 28 Java/Android
JavaWeb 入门:Hello Servlet
Jul 16 Java/Android
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
Aug 30 Java/Android
SpringBoot2零基础到精通之数据与页面响应
Mar 22 Java/Android
Java 写一个简单的图书管理系统
Apr 26 Java/Android
springcloud整合seata
May 20 Java/Android
java获取一个文本文件的编码(格式)信息
Sep 23 Java/Android
一篇带你入门Java垃圾回收器
Java实现简易的分词器功能
Java用自带的Image IO给图片添加水印
java Nio使用NioSocket客户端与服务端交互实现方式
JVM入门之类加载与字节码技术(类加载与类的加载器)
Spring Cache和EhCache实现缓存管理方式
浅析NIO系列之TCP
You might like
晶体管单管来复再生式收音机
2021/03/02 无线电
PHP图片处理类 phpThumb参数用法介绍
2012/03/11 PHP
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
ajax调用返回php接口返回json数据的方法(必看篇)
2017/05/05 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
2021/02/26 PHP
论坛特效代码收集(落伍转发-不错)
2006/12/02 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
js使用for循环及if语句判断多个一样的name
2014/09/09 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
Bootstrap基本样式学习笔记之标签(5)
2016/12/07 Javascript
JS中解决谷歌浏览器记住密码输入框颜色改变功能
2017/02/13 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
BootStrap Select清除选中的状态恢复默认状态
2017/06/20 Javascript
微信小程序中上传图片并进行压缩的实现代码
2018/08/28 Javascript
JavaScript创建对象方法实例小结
2018/09/03 Javascript
JS数组去重的6种方法完整实例
2018/12/08 Javascript
微信小程序学习总结(五)常见问题实例小结
2020/06/04 Javascript
[01:10:03]OG vs EG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
Python-嵌套列表list的全面解析
2016/06/08 Python
Python中偏函数用法示例
2018/06/07 Python
快速解决pandas.read_csv()乱码的问题
2018/06/15 Python
Python爬取qq空间说说的实例代码
2018/08/17 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
美国温暖商店:The Warming Store
2018/12/15 全球购物
经贸日语毕业生自荐信
2013/11/03 职场文书
小型女装店的创业计划书
2014/01/09 职场文书
《掌声》教学反思
2014/02/23 职场文书
食品采购员岗位职责
2014/04/14 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
综合素质评价个性发展自我评价
2015/03/06 职场文书
2015年禁毒宣传活动总结
2015/03/25 职场文书
详解JavaScript中Arguments对象用途
2021/08/30 Javascript
java实现自定义时钟并实现走时功能
2022/06/21 Java/Android
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
2022/08/14 Servers