升级至WildFly 36后Hibernate RevisionListener中SecurityContext为空问题
问题描述
将WildFly从29版本升级至36版本后,原本在WildFly 29中正常运行的CustomRevisionListener类,其中注入的SecurityContext变为null。两个版本对应的Hibernate ORM版本分别为:WildFly 29搭配6.2.6.Final,WildFly 36搭配6.6.7.Final,涉及代码如下:
import jakarta.inject.Inject; import jakarta.security.enterprise.SecurityContext; import org.hibernate.envers.RevisionListener; public class CustomRevisionListener implements RevisionListener { @Inject private SecurityContext context; }
问题原因
Hibernate ORM从6.3.x版本开始,调整了EnversRevisionListener的实例化逻辑:
- 在6.2.x及更早版本中,WildFly的CDI容器负责管理
RevisionListener实例,因此依赖注入可以正常工作。 - 6.3.x之后,Hibernate改为直接通过反射创建
RevisionListener实例,不再交由CDI容器托管,导致@Inject标注的SecurityContext无法被CDI容器填充,最终出现null值。
修复方案
提供两种可行的修复方式:
方式一:手动通过CDI获取SecurityContext
修改CustomRevisionListener的代码,利用CDI API手动获取SecurityContext实例:
import jakarta.enterprise.inject.spi.CDI; import jakarta.security.enterprise.SecurityContext; import org.hibernate.envers.RevisionListener; public class CustomRevisionListener implements RevisionListener { @Override public void newRevision(Object revisionEntity) { SecurityContext securityContext = CDI.current().select(SecurityContext.class).get(); // 这里添加使用securityContext的业务逻辑 } }
方式二:开启Hibernate Envers的CDI注入支持
在项目的persistence.xml中添加Hibernate配置属性,让Hibernate委托CDI容器创建RevisionListener实例:
<property name="hibernate.envers.revision_listener_cdi_injection_enabled" value="true"/>
该配置是Hibernate 6.3及以上版本新增的,开启后会恢复依赖注入的支持,无需修改原有代码。
内容的提问来源于stack exchange,提问作者grigouille
相关产品推荐
相关产品推荐

