記處理spring-devtools 和 通用mapper 使用問題


問題:

  tk.mybatis.mapper.MapperException: 無法獲取實體類com.*.* 對應的表名

環境:

  springboot 2.0.6, 通用mapper 2.0.4,還有 spring-devtools 

描述一下:

  這個環境我之前在用,也用的好好的,並沒有出問題。

解決:

  問題出來了還是中文異常(通用mapper 拋出的異常),習慣性的度娘,其實這個問題我之前遇到過,果真度娘上的大神都說是配置問題(@MapperScan 導入包為import tk.mybatis.spring.annotation.MapperScan;),怎么可能?我還是檢查了一下,當然不可能是配置出錯了。

  去翻了一下通用mapper的文檔,找到問題了:Spring Boot 中使用 Devtools 和 通用mapper 不兼容,作者說問題是因為熱部署插件會把項目中classes下的類和jar包下的類分開加載(RestartClassLoader ,AppClassLoader ),通用mapper的EntityHelper初始化就讀不到相關的實體類信息了,之前的版本解決方法就是把mapper的相關jar包通過配置讓RestartClassLoader去加載,我也跟着試了一下,發現並不行。繼續看文檔。。。然后看到作者寫道:“如果你真遇到這個問題,最直接的方法就是禁用 Devtools 工具。”........不可能算了,熱部署在開發中這么方便,丟了實在可惜,想想作者發現的問題就是類不是同一種方式加載的,那上面的配置應該是正確的思路,別人怎么就能解決呢。

  看着看着就有了新發現:我這里mapper加載到的實體類和接口有的是其他項目中寫的,然后通過本地jar導入當前項目的 和通用mapper和作者之前測試 時說的情況差不多。那就把這些實體類接口通過配置讓RestartClassLoader去加載(spring-devtools.properties):

restart.include.mapper=/mapper-[\\w-\\.]+jar,/mycorp-[\\w-\\.]+jar

啟動測試....  媽蛋,還是這個錯。想想mapper作者說過:“最合理的情況就是沒有 spring-devtools.properties 配置文件”。那就是不用把通用mapper相關包加進去:

restart.include.mapper=/mycorp-[\\w-\\.]+jar

理論上這樣才合理(這樣也行,那應該時我上面的配置用“,”隔開是錯的。。):

restart.include.mapper=/mapper-[\\w-\\.]+jar
restart.include.myname=/mycorp-[\\w-\\.]+jar

這樣把我自己的實體類和接口包使用RestartClassLoader去加載,啟動測試.... 竟然可以了


問題估計就是通用mapper需要掃描的接口和對應的實體類沒有掃描到而已,所以要用熱部署和通用mapper的話就檢查一下所使用的mapper接口和實體類有沒有可能不在
RestartClassLoader中加載

 

參考:Spring DevTools 介紹

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM