2016-11-08 67 views
2

我希望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中實現這一點的正確方法是什麼?

+0

那麼,如果你只配置的東西一半那顯然是行不通的。您還必須禁用'@ EnableTransactionManagement'並添加註釋所做的一切... –

回答

2

你還是實現自己的批註 - reference

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

是的我也在考慮這個選項,但是我不喜歡它的地方是自定義註釋必須用於所有地方而不是標準的@Transactional註解和將來某個人可能會忘記這一點,他們將創建一個錯誤。 – Jardo