Example例項化報錯:"無法獲取實體類XXX對應的表名!"
mybatis Example遇到的問題:
Example例項化的時候報錯:
還有一個令人疑惑的現象,當使用junit單元測試直接呼叫service介面的時候,程式不會報錯,可以拿到對應的表名物件。但是用postman和前端的請求就獲取不到表名。
報錯的入口是在Example例項化時:
Java code?
1 |
|
這個問題debug看,Example裡面EntityHelper的map例項化的時候是有值的,程式跑到EntityHelper原始碼的第63行(getEntityTable方法),在有key、有value的情況下,map.get(key)獲取不到值。EntityHelper部分原始碼(太多貼不下,類名為:tk.mybatis.mapper.mapperhelper.EntityHelper)如下:
Java code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
new HashMap<Class<?>, EntityTable>();
new RuntimeException( "無法獲取實體類" + entityClass.getCanonicalName() + "對應的表名!" );
|
請問這是什麼原因造成的,可能的原因有哪些,應該如何解決?
問題已解決,原因是單元測試和controller調service時傳的DO物件是由不同的classload載入的,所以雖然debug看到的類名是一樣的,但是還是get不到。至於這個classloader哪來的,百度了一下是因為這個jar包 spring-boot-devtools ;刪除之後Example即可正常例項化,獲取到表名。
專案中開發過程中的一個問題,記錄一下。
通過Junittest啟動和Application啟動專案得到的結果不一樣,經排查,程式中呼叫了isAssignableFrom方法,發現同一個類A.isAssignableFrom(A)返回false,經過debug對比,發現雖然類A看起來是一樣,但是通過不同的classloader載入的,一個是AppClassLoader,一個是restartClassLoader, 這樣的話,底層便認為是兩個不同的類A在比較。
問題解決:restartClassLoader是spring-boot-devtools這個包裡面的,只是為了開發時熱部署使用,棄用該包後程序執行正常。