升级hibernate-jpamodelgen至6.5.2.Final后遇NullPointerException问题
升级hibernate-jpamodelgen至6.5.2.Final后注解处理阶段抛出NullPointerException
问题概述
将org.hibernate.orm:hibernate-jpamodelgen从6.3.1.Final升级到6.5.2.Final(为适配Spring Boot 3.3.0)后,注解处理阶段触发NullPointerException,报错信息如下:
无法调用"javax.lang.model.element.Element.getAnnotationMirrors()",因为"element"为null
调试确认触发问题的元素是Java模块实例(com.sun.tools.javac.code.Symbol.ModuleSymbol),调用context.getElementUtils().getPackageOf(element)返回null,后续代码未做null校验直接调用方法导致异常。当前环境:Apache Maven 3.8.4、maven-compiler-plugin 3.13.0、OpenJDK 17。
问题定位
此问题属于hibernate-jpamodelgen的版本bug,而非JDK问题:
- 6.5.x版本的jpamodelgen在处理模块级元素时,未针对
getPackageOf(ModuleSymbol)返回null的场景做防护——模块本身不属于任何包,JDK元素工具返回null是符合规范的,但jpamodelgen后续代码直接使用该null值调用getAnnotationMirrors(),从而抛出NPE。 - 6.3.1.Final版本的处理逻辑中,要么对模块元素做了过滤,要么存在null校验,因此未触发该异常。
规避方案
可尝试以下几种方式解决:
- 临时降级版本:若Spring Boot 3.3.0兼容,暂时回退至
hibernate-jpamodelgen:6.3.1.Final,待Hibernate官方修复该bug后再升级。 - 配置编译器插件跳过模块处理:在
maven-compiler-plugin中添加参数,让注解处理器忽略模块元素:
若上述参数无效,也可临时调整注解处理器范围,仅处理特定包下的元素。<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.13.0</version> <configuration> <annotationProcessorPaths> <path> <groupId>org.hibernate.orm</groupId> <artifactId>hibernate-jpamodelgen</artifactId> <version>6.5.2.Final</version> </path> </annotationProcessorPaths> <compilerArgs> <!-- 让JPAModelGen忽略模块信息 --> <arg>-Ahibernate.jpamodelgen.ignoreModuleInfo=true</arg> </compilerArgs> </configuration> </plugin> - 等待官方修复:可查看Hibernate的issue仓库确认是否已有对应修复版本,若未解决可提交issue反馈该问题。
内容的提问来源于stack exchange,提问作者Yury Shafran
相关产品推荐
相关产品推荐

