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 |
|
请问这是什么原因造成的,可能的原因有哪些,应该如何解决?
问题已解决,原因是单元测试和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这个包里面的,只是为了开发时热部署使用,弃用该包后程序运行正常。