解决tk mapper 通用mapper的bug问题
如下所示:
<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
再启动服务,服务正常使用,热部署也能够保留
问题一的最终解决
结合问题三的解决思路,那么咱们在不升级通用mapper的前提下,让项目依赖打包出来的jar运行,则仅需在
项目src/main/resources目录新建一个文件夹META-INF(项目右键-new-Source Folder),添加热部署配置文件spring-devtools.properties,在文件里面添加
restart.include.companycommonlibs=kemean.*
问题一就在不升级通用mapper下完美解决了~
以上为个人经验,希望能给大家一个参考,也希望大家多多支持猪先飞。
相关文章
- 这篇文章主要介绍了C#中的两种debug方法介绍,本文讲解了代码用 #if DEBUG 包裹、利用宏定义两种方法,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了解决idea中debug工具栏消失后如何显示的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-18
mybatis-plus mapper中foreach循环操作代码详解(新增或修改)
这篇文章主要介绍了mybatis-plus mapper中foreach循环操作代码详解(新增或修改),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-17- 这篇文章主要介绍了idea 无法debug调试的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-09
- 这篇文章主要介绍了解决tk mapper 通用mapper的bug问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-16
- 这篇文章主要介绍了pycharm debug 断点调试心得分享,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-16
解决ObjectMapper.convertValue() 遇到的一些问题
这篇文章主要介绍了解决ObjectMapper.convertValue() 遇到的一些问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-30- vs的断点调试功能很强大有木有,能查看所有变量有木有。php调试很麻烦有木有,echo,var_dump写得你想吐了有木有。想体验一下ide调试的快感吗?那就来使用xdebug吧...2016-01-02
mybatis mapper互相引用resultMap启动出错的解决
这篇文章主要介绍了mybatis mapper互相引用resultMap启动出错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-25- 在IIS6中,创建一下test.asp;jpg的文件,是可以直接执行的...2016-01-27
- Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况了,下面我们来看php5中Xdebug配置安装,希望能帮助到各位。 Xdeb...2016-11-25
python读取dicom图像示例(SimpleITK和dicom包实现)
今天小编就为大家分享一篇python读取dicom图像示例(SimpleITK和dicom包实现),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27- 使用 use re 'debug' 查看正则表达式的匹配过程,参见如下的代码...2020-06-29
- 这篇文章主要介绍了使用ObjectMapper把Json转换为复杂的实体类操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-18
JavaScript中offsetWidth的bug及解决方法
这篇文章主要为大家详细介绍了JavaScript中offsetWidth的bug及解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-05-22- 这篇文章主要介绍了Jackson库中objectMapper的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-06-20
- 这篇文章主要为大家详细介绍了项目发布Debug和Release版的区别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-10-21
- 这篇文章主要介绍了Golang中Delve版本太低无法Debug的问题,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-16
- 众所周知断点对于Visual Studio调试过程是十分重要的,断点的设置也是为了更好的进行调试。下面这篇文章主要给大家介绍了关于Visual Studio Debug实战教程之断点操作的相关资料,需要的朋友可以参考下...2021-09-22
- 这篇文章主要给大家介绍了关于Visual Studio Debug实战教程之基础入门的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22