【通用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對應的表名!
問題解決
-
修改啟動類@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