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这个包里面的,只是为了开发时热部署使用,弃用该包后程序运行正常。

猜你喜欢

转载自blog.csdn.net/qq_31868149/article/details/79917669