错误日志:
2021-11-11 20:51:18.304 maomao 3896 [nio-8081-exec-2] ERROR c.maomao.common.GlobalExceptionHandler 79: java.lang.ClassCastException: com.maomao.learning.entity.LMCourseChapterDO cannot be cast to com.maomao.learning.entity.LMCourseChapterDO
实体集合是 hibernate 查到的结果,为啥不能操作了,for循环,stream处理都不行呢
源代码:
List<LMCourseChapterDO> courseChapterList = lmDao.find(
"from LMCourseChapterDO l where l.course_id = ?0 and is_delete=0", courseId);
List<LMCourseChapterDTO> courseChapterDTOS = courseChapterList.stream().map(LMCourseChapterDO::toDTO).collect(Collectors.toList());
报错提示下面转换的一行发生了类转换异常。
编译正常,为啥运行时还能发生这个错误呢?
你猜是为啥?
明明类的全路径是一样的,整个项目也只有一个同名的类,所以和缓存,JDK,Idea 之类的环境没什么关系,不用瞎想。。。
要我说,我猜是类加载器的问题!因为一个类为什么是它本身,就是类的全路径和类加载决定的,所以我加了下面一段逻辑
for (int i = 0; i < courseChapter.size(); i++) {
Object lmCourseChapterDO = courseChapter.get(i);
System.out.println("getClass:" + lmCourseChapterDO.getClass());
System.out.println("new getClass:" + LMCourseChapterDO.class);
System.out.println("getClassLoader:" + lmCourseChapterDO.getClass().getClassLoader());
System.out.println("new getClassLoader:" + LMCourseChapterDO.class.getClassLoader());
}
注意,这里的每一个对象一定要是Object,如果直接指定肯定是直接报类转换异常的嘛,不多讲。结果:
getClass:class com.maomao.learning.entity.LMCourseChapterDO
new getClass:class com.maomao.learning.entity.LMCourseChapterDO
getClassLoader:sun.misc.Launcher$AppClassLoader@18b4aac2
new getClassLoader:org.springframework.boot.devtools.restart.classloader.RestartClassLoader@7ec0d3cd
很明显嘛!
就是类加载器不一样嘛!
那怎么解决呢?
哈哈哈,我解决了,而且直接看打出来的类加载器来源就知道怎么解决了!
不过真有人有同样的问题么?