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

如何在非Spring Boot的Spring应用中启用@Transactional注解处理?

Spring + Struts 遗留应用启用@Transactional注解替代TransactionTemplate

要在你的Spring+Struts遗留应用里用@Transactional替代TransactionTemplate的样板代码,按以下步骤操作:

1. 启用Spring声明式事务管理

你已经有PlatformTransactionManager实例,只需开启注解驱动的事务支持:

  • XML配置方式:在Spring配置文件中添加:
<tx:annotation-driven transaction-manager="platformTransactionManager"/>
<!-- 确保platformTransactionManager是你已定义的事务管理器bean的id -->
  • Java配置方式:在配置类上添加@EnableTransactionManagement注解:
@Configuration
@EnableTransactionManagement
public class AppConfig {
    // 已有的PlatformTransactionManager bean定义
    @Bean
    public PlatformTransactionManager platformTransactionManager() {
        // 你的实现代码
    }
}

2. 确保目标Bean被Spring容器管理

Struts默认自行创建Action实例,Spring的AOP代理无法对其生效,需将Action交给Spring管理:

  • 配置Struts使用Spring对象工厂:在struts.xml中添加:
<constant name="struts.objectFactory" value="spring"/>
  • 将Struts Action声明为Spring原型Bean(Struts Action通常需要多例):
<bean id="yourAction" class="com.yourpackage.YourAction" scope="prototype">
    <!-- 注入业务类等依赖 -->
</bean>

或Java配置:

@Bean
@Scope("prototype")
public YourAction yourAction() {
    return new YourAction();
}

3. 替换TransactionTemplate代码

直接在需要事务的方法上添加@Transactional注解,将原业务逻辑移入方法内:

@Transactional
public void transactionalOp(Req request, Resp responseObserver) {
    // 原internalTransactionalOp中的业务代码直接编写在此
}

关键注意事项

  • 方法访问权限:@Transactional仅对public方法生效,确保目标方法为public修饰。
  • 避免自调用问题:同一类内部调用带@Transactional的方法时,Spring动态代理不会触发事务。解决方式:将事务方法抽取到独立业务Bean中,通过依赖注入调用。
  • 事务属性对齐:根据原TransactionTemplate的配置调整@Transactional属性,例如传播行为、隔离级别、回滚规则。默认传播行为PROPAGATION_REQUIRED与@Transactional默认值一致;若需回滚所有异常,可写@Transactional(rollbackFor = Exception.class)。
  • 依赖注入检查:确保Action中的业务类通过Spring注入(如@Autowired),而非手动new,否则业务类的@Transactional不会生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:33:33