2017-07-04 54 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