2017-07-04 57 views
2

配置Spring在非RuntimeExceptions上回滾的一種方法是在服務類上使用@Transactional(rollbackFor=...)批註。這種方法的問題是,我們需要爲幾乎所有的服務類定義(rollbackFor = ...),這看起來真是多餘。彈簧:檢查異常時自動回滾


我的問題:有沒有什麼方法來配置Spring的事務管理器的缺省行爲在非RuntimeException回滾時,它會發生未聲明的每@Transactional註釋。就像在EJB中的異常類上使用@ApplicationException(rollback=true)註釋一樣。

+0

選中此「回滾」部分:http://www.dineshonjava.com/2012/12/declarative-transaction-management.html – Afridi

回答

4

不能與@Transactional應用層面做到這一點,但你可以:

變體1:延長@Transactional註解,並把它作爲的rollbackFor默認值。但設置的rollbackFor unchecked異常只是你需要。隨着這個你可以控制回滾僅供情況下,你肯定,並避免@Transactional的拷貝過去(的rollbackFor = MyCheckedException.class)

像:

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

並使用這個註解來代替標準的@Transactional。

變種2:你可以從AnnotationTransactionAttributeSource和覆蓋方法創建擴展determineTransactionAttribute:

protected TransactionAttribute determineTransactionAttribute(AnnotatedElement ae) 
//Determine the transaction attribute for the given method or class. 

TransactionAttribute看TransactionAttribute api,有一種方法

布爾rollbackOn(Throwable的前),我們應該推出回到特定的例外?

protected TransactionAttribute determineTransactionAttribute(
    AnnotatedElement ae) { 
    return new DelegatingTransactionAttribute(target) { 
     @Override 
     public boolean rollbackOn(Throwable ex) { 
      return (check is exception type as you need for rollback); 
     } 
}; 

}

第二種方法是不是你做的事務管理器它真的全球化,所以不如第一。更好地使用自定義註釋,因爲您可以控制它,只適用於您真正需要它的方法/類。但是,如果您在任何情況下都需要使用第二個變體,那麼這將是您的默認跨國行爲。

+0

謝謝,擴展@Transactional註釋是一個好主意。 – sara