1. 程式人生 > >spring boot+tkmybatis(mapper)工具實現通用數據操作接口時遇到的問題

spring boot+tkmybatis(mapper)工具實現通用數據操作接口時遇到的問題

之前 開始 ng- key lang ces 解決 是不是 就是

最近在做一個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)工具實現通用數據操作接口時遇到的問題