我希望Spring在使用@Transactional
註釋的方法上回滾事務,以防萬一該方法拋出一個檢查異常。這方面的一個等價的:Spring:在Java配置中定義自定義@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;
}
這也沒有工作 - 用自己的事務屬性源(不同的實例比是在創建一個彈簧保持配置)。
在Java中實現這一點的正確方法是什麼?
那麼,如果你只配置的東西一半那顯然是行不通的。您還必須禁用'@ EnableTransactionManagement'並添加註釋所做的一切... –