我希望Spring在使用@Transactional
注释的方法上回滚事务,以防方法抛出已检查的异常。相当于:
@Transactional(rollbackFor=MyCheckedException.class)
public void method() throws MyCheckedException {
}
但我需要将此行为作为所有@Transactional
注释的默认行为,而无需在任何地方编写它。我们使用Java来配置Spring(配置类)。
我尝试了spring documentation建议的配置,该配置仅在XML中提供。所以我尝试创建这个XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" rollback-for="com.example.MyCheckedException" />
</tx:attributes>
</tx:advice>
</beans>
...并通过@ImportResource
导入。 Spring确实识别并解析了文件(我最初有一些错误),但它不起作用。 @Transactional
的行为没有改变。
我也尝试定义自己的事务属性源,如this answer中所述。但它也使用了XML配置,因此我不得不将其转换为Java:
@Bean
public AnnotationTransactionAttributeSource getTransactionAttributeSource() {
return new RollbackForAllAnnotationTransactionAttributeSource();
}
@Bean
public TransactionInterceptor getTransactionInterceptor(TransactionAttributeSource transactionAttributeSource) {
TransactionInterceptor transactionInterceptor = new TransactionInterceptor();
transactionInterceptor.setTransactionAttributeSource(transactionAttributeSource);
return transactionInterceptor;
}
@Bean
public BeanFactoryTransactionAttributeSourceAdvisor getBeanFactoryTransactionAttributeSourceAdvisor(TransactionAttributeSource transactionAttributeSource) {
BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor();
advisor.setTransactionAttributeSource(transactionAttributeSource);
return advisor;
}
这也行不通 - Spring继续使用自己的事务属性源(与配置中创建的实例不同的实例)。
在Java中实现这一目标的正确方法是什么?
答案 0 :(得分:3)
您应该实现自己的注释 - reference
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional(rollbackFor=MyCheckedException.class)
public @interface TransactionalWithRollback {
}