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

迁移至Spring 5后@Transactional注解失效问题求助

解决Spring 5.3.x + JDK 17 + AspectJ 1.9.x下@Transactional注解失效问题

核心排查与修复方案

1. 适配JDK 17模块系统的织入配置

JDK 17启用强模块化,AspectJ加载时织入(LTW)需突破模块访问限制,必须在JVM启动参数中添加:

--add-opens java.base/java.lang=ALL-UNNAMED
--add-opens java.base/java.lang.reflect=ALL-UNNAMED

同时确保通过JavaAgent启动AspectJ织入器:

-javaagent:path/to/aspectjweaver-1.9.20.1.jar

2. 修正META-INF/aop.xml织入规则

检查项目中的META-INF/aop.xml是否正确指定织入范围和事务切面:

<aspectj>
  <weaver options="-verbose -showWeaveInfo">
    <!-- 替换为你的业务包路径 -->
    <include within="com.yourcompany..*"/>
  </weaver>
  <aspects>
    <aspect name="org.springframework.transaction.aspectj.AnnotationTransactionAspect"/>
  </aspects>
</aspectj>

启用-verbose -showWeaveInfo可在日志中查看织入细节,确认目标类是否被正确处理。

3. 正确初始化AnnotationTransactionAspect

手动定义该切面时,必须通过AspectJ的aspectOf()获取单例实例并注入事务管理器,不能用常规@Component扫描:

@Bean
public AnnotationTransactionAspect annotationTransactionAspect(PlatformTransactionManager transactionManager) {
    AnnotationTransactionAspect aspect = AnnotationTransactionAspect.aspectOf();
    aspect.setTransactionManager(transactionManager);
    return aspect;
}

4. 适配Spring LTW的类加载器

若为Web容器(如Tomcat)部署,需指定容器专属织入器避免类加载冲突:

<context:load-time-weaver weaver-class="org.springframework.instrument.classloading.tomcat.TomcatLoadTimeWeaver"/>

同时确保项目无自定义ClassLoader干扰织入流程。

5. 验证事务方法的织入场景

  • 确认@Transactional标注的类是Spring管理的Bean,AspectJ LTW支持内部方法调用,但需确保类被成功织入。
  • 临时切换tx:annotation-driven的mode为proxy,若事务生效,说明问题集中在AspectJ织入环节,而非事务管理器本身。

6. 对齐依赖版本

确保spring-aspects版本与Spring核心版本完全一致,避免版本不兼容:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aspects</artifactId>
  <version>5.3.x.RELEASE</version> <!-- 与spring-core版本一致 -->
</dependency>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:22:45