You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 13:52:01