1. 程式人生 > >Example例項化報錯:"無法獲取實體類XXX對應的表名!"

Example例項化報錯:"無法獲取實體類XXX對應的表名!"

mybatis Example遇到的問題:
Example例項化的時候報錯:
還有一個令人疑惑的現象,當使用junit單元測試直接呼叫service介面的時候,程式不會報錯,可以拿到對應的表名物件。但是用postman和前端的請求就獲取不到表名。
報錯的入口是在Example例項化時:

Java code?

1

Example example = new Example(User.class);


這個問題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

public class EntityHelper {

/**

* 實體類 => 表物件

*/

private static final Map<Class<?>, EntityTable> entityTableMap = 

new HashMap<Class<?>, EntityTable>();

/**

* 獲取表物件

*

* @param entityClass

* @return

*/

public static EntityTable getEntityTable(Class<?> entityClass) {

EntityTable entityTable = entityTableMap.get(entityClass);

if (entityTable == null) {

throw

 new RuntimeException("無法獲取實體類" + entityClass.getCanonicalName() + "對應的表名!");

}

return entityTable;

}

}

請問這是什麼原因造成的,可能的原因有哪些,應該如何解決?

問題已解決,原因是單元測試和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這個包裡面的,只是為了開發時熱部署使用,棄用該包後程序執行正常。