Подход с пользовательской аннотацией выглядит хорошо и просто, но если вы на самом деле не хотите его использовать, вы можете создать пользовательский TransactionAttributeSource
для изменения интерпретации @Transactional
:
public class RollbackForAllAnnotationTransactionAttributeSource
extends AnnotationTransactionAttributeSource {
@Override
protected TransactionAttribute determineTransactionAttribute(
AnnotatedElement ae) {
TransactionAttribute target = super.determineTransactionAttribute(ae);
if (target == null) return null;
else return new DelegatingTransactionAttribute(target) {
@Override
public boolean rollbackOn(Throwable ex) {
return true;
}
};
}
}
Ивместо <tx:annotation-driven/>
вы настраиваете его вручную следующим образом (см. источник AnnotationDrivenBeanDefinitionParser
):
<bean id = "txAttributeSource"
class = "RollbackForAllAnnotationTransactionAttributeSource" />
<bean id = "txInterceptor"
class = "org.springframework.transaction.interceptor.TransactionInterceptor">
<property name = "transactionManagerBeanName" value = "transactionManager" />
<property name = "transactionAttributeSource" ref = "txAttributeSource" />
</bean>
<bean
class = "org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor">
<property name="transactionAttributeSource" ref = "txAttributeSource" />
<property name = "adviceBeanName" value = "txInterceptor" />
</bean>
Также вам необходимо <aop:config/>
или <aop:aspectj-autoproxy />
.
Однако обратите внимание, чтоПереопределения могут сбивать с толку других разработчиков, которые ожидают нормального поведения @Transactional
.