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

JHipster 3.8.0中Spring @Transactional不生效且无日志输出求助

JHipster中@Transactional方法未生成预期事务日志的排查方案

问题描述

我正在使用JHipster 3.8.0,某个标注了@Transactional的方法未生成预期日志,已配置logging.level.org.springframework.transaction.interceptor = TRACE。

相关代码

...
@Repository
public class CustomAuditEventRepository implements AuditEventRepository {

    private static final String AUTHORIZATION_FAILURE = "AUTHORIZATION_FAILURE";

    private final PersistenceAuditEventRepository persistenceAuditEventRepository;

    private final AuditEventConverter auditEventConverter;

    public CustomAuditEventRepository(PersistenceAuditEventRepository persistenceAuditEventRepository,
            AuditEventConverter auditEventConverter) {

        this.persistenceAuditEventRepository = persistenceAuditEventRepository;
        this.auditEventConverter = auditEventConverter;
    }

    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void add(AuditEvent event) {
        if (!AUTHORIZATION_FAILURE.equals(event.getType()) &&
            !Constants.ANONYMOUS_USER.equals(event.getPrincipal())) {

            PersistentAuditEvent persistentAuditEvent = new PersistentAuditEvent();
            persistentAuditEvent.setPrincipal(event.getPrincipal());
            persistentAuditEvent.setAuditEventType(event.getType());
            persistentAuditEvent.setAuditEventDate(event.getTimestamp());
            Map<String, String> eventData = auditEventConverter.convertDataToStrings(event.getData());
            persistentAuditEvent.setData(truncate(eventData));
            persistenceAuditEventRepository.save(persistentAuditEvent);
        }
    }

    private Map<String, String> truncate(Map<String, String> data) {
        ....
    }
}

系统配置

  • jhipsterVersion: "6.9.1"
  • databaseType: "mongodb"

排查思路

  • 确认MongoDB事务支持是否生效:Spring Data MongoDB 3.0+才支持事务,且MongoDB服务器需为4.0+的副本集模式(单节点默认不支持事务)。JHipster 6.9.1对应的Spring Data版本可能未达到要求,若事务本身无法创建,自然不会生成日志。
  • 验证日志配置是否生效:检查对应环境的配置文件(如application-dev.yml)中logging.level.org.springframework.transaction.interceptor是否确实设为TRACE,可临时添加另一个类的TRACE日志(如org.springframework.data.mongodb),确认日志框架能正常输出TRACE级别内容。
  • 检查方法调用是否走代理:Spring动态代理仅拦截外部类对add方法的调用,若该方法被本类内部方法调用,事务代理不会生效,日志也不会产生。确认调用方为外部类实例。
  • 排查日志过滤规则:部分日志框架(如Logback)的配置可能存在过滤器,屏蔽了TRACE级别的日志。检查日志配置文件中的过滤规则,确保未拦截org.springframework.transaction.interceptor的日志输出。
  • 测试事务传播属性:当前使用Propagation.REQUIRES_NEW,若MongoDB不支持事务,该属性会被忽略。可临时替换为默认的Propagation.REQUIRED,观察是否有日志输出。
  • 确认方法是否被执行:在add方法开头添加自定义日志,验证方法确实被调用,排除因业务逻辑(如条件判断跳过执行)导致无日志的情况。

内容的提问来源于stack exchange,提问作者Adam D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:36:22