gpt4 book ai didi

java - Spring:在 Java 配置中定义自定义 @Transactional 行为

转载 作者:行者123 更新时间:2023-11-30 07:58:23 26 4
gpt4 key购买 nike

我希望 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 中实现此目的的正确方法是什么?

最佳答案

您应该实现自己的注释 - reference

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Transactional(rollbackFor=MyCheckedException.class)
public @interface TransactionalWithRollback {
}

关于java - Spring:在 Java 配置中定义自定义 @Transactional 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40495821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com