1. 程式人生 > >【通用mapper】專案升級通用Mapper引發的一連串問題以及問題解決

【通用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錯誤(問題一)。

  1. 問題一

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對應的表名!

問題解決

  • 修改啟動類@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方法!

問題解決:把專案熱部署去掉

<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.* 

再啟動服務,服務正常使用,熱部署也能夠保留

問題一的最終解決

結合問題三的解決思路,那麼咱們在不升級通用mapper的前提下,讓專案依賴打包出來的jar執行,則僅需在 專案src/main/resources目錄新建一個資料夾META-INF(專案右鍵-new-Source Folder),新增熱部署配置檔案spring-devtools.properties,在檔案裡面新增

restart.include.companycommonlibs=kemean.* 

問題一就在不升級通用mapper下完美解決了

end