DATACMNS-720 - Improved disabling of default transactions.
When default transactions get disabled, we now still configure a TransactionInterceptor to make sure explicitly defined transactions are still applied. Previously the interceptor was not registered at all if default transactions were configured to be turned off and thus even explicitly declared transaction configuration was not considered. Related tickets: DATACMNS-656.
This commit is contained in:
@@ -71,10 +71,7 @@ public abstract class TransactionalRepositoryFactoryBeanSupport<T extends Reposi
|
||||
|
||||
RepositoryFactorySupport factory = doCreateRepositoryFactory();
|
||||
factory.addRepositoryProxyPostProcessor(exceptionPostProcessor);
|
||||
|
||||
if (enableDefaultTransactions) {
|
||||
factory.addRepositoryProxyPostProcessor(txPostProcessor);
|
||||
}
|
||||
factory.addRepositoryProxyPostProcessor(txPostProcessor);
|
||||
|
||||
return factory;
|
||||
}
|
||||
@@ -95,7 +92,8 @@ public abstract class TransactionalRepositoryFactoryBeanSupport<T extends Reposi
|
||||
Assert.isInstanceOf(ListableBeanFactory.class, beanFactory);
|
||||
|
||||
ListableBeanFactory listableBeanFactory = (ListableBeanFactory) beanFactory;
|
||||
this.txPostProcessor = new TransactionalRepositoryProxyPostProcessor(listableBeanFactory, transactionManagerName);
|
||||
this.txPostProcessor = new TransactionalRepositoryProxyPostProcessor(listableBeanFactory, transactionManagerName,
|
||||
enableDefaultTransactions);
|
||||
this.exceptionPostProcessor = new PersistenceExceptionTranslationRepositoryProxyPostProcessor(listableBeanFactory);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,6 +56,7 @@ class TransactionalRepositoryProxyPostProcessor implements RepositoryProxyPostPr
|
||||
|
||||
private final BeanFactory beanFactory;
|
||||
private final String transactionManagerName;
|
||||
private final boolean enableDefaultTransactions;
|
||||
|
||||
/**
|
||||
* Creates a new {@link TransactionalRepositoryProxyPostProcessor} using the given {@link ListableBeanFactory} and
|
||||
@@ -63,14 +64,17 @@ class TransactionalRepositoryProxyPostProcessor implements RepositoryProxyPostPr
|
||||
*
|
||||
* @param beanFactory must not be {@literal null}.
|
||||
* @param transactionManagerName must not be {@literal null} or empty.
|
||||
* @param enableDefaultTransaction
|
||||
*/
|
||||
public TransactionalRepositoryProxyPostProcessor(ListableBeanFactory beanFactory, String transactionManagerName) {
|
||||
public TransactionalRepositoryProxyPostProcessor(ListableBeanFactory beanFactory, String transactionManagerName,
|
||||
boolean enableDefaultTransaction) {
|
||||
|
||||
Assert.notNull(beanFactory);
|
||||
Assert.notNull(transactionManagerName);
|
||||
|
||||
this.beanFactory = beanFactory;
|
||||
this.transactionManagerName = transactionManagerName;
|
||||
this.enableDefaultTransactions = enableDefaultTransaction;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -81,6 +85,7 @@ class TransactionalRepositoryProxyPostProcessor implements RepositoryProxyPostPr
|
||||
|
||||
CustomAnnotationTransactionAttributeSource transactionAttributeSource = new CustomAnnotationTransactionAttributeSource();
|
||||
transactionAttributeSource.setRepositoryInformation(repositoryInformation);
|
||||
transactionAttributeSource.setEnableDefaultTransactions(enableDefaultTransactions);
|
||||
|
||||
TransactionInterceptor transactionInterceptor = new TransactionInterceptor(null, transactionAttributeSource);
|
||||
transactionInterceptor.setTransactionManagerBeanName(transactionManagerName);
|
||||
@@ -259,6 +264,7 @@ class TransactionalRepositoryProxyPostProcessor implements RepositoryProxyPostPr
|
||||
final Map<Object, TransactionAttribute> attributeCache = new ConcurrentHashMap<Object, TransactionAttribute>();
|
||||
|
||||
private RepositoryInformation repositoryInformation;
|
||||
private boolean enableDefaultTransactions = true;
|
||||
|
||||
/**
|
||||
* @param repositoryInformation the repositoryInformation to set
|
||||
@@ -267,6 +273,13 @@ class TransactionalRepositoryProxyPostProcessor implements RepositoryProxyPostPr
|
||||
this.repositoryInformation = repositoryInformation;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param enableDefaultTransactions the enableDefaultTransactions to set
|
||||
*/
|
||||
public void setEnableDefaultTransactions(boolean enableDefaultTransactions) {
|
||||
this.enableDefaultTransactions = enableDefaultTransactions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the transaction attribute for this method invocation.
|
||||
* <p>
|
||||
@@ -349,7 +362,7 @@ class TransactionalRepositoryProxyPostProcessor implements RepositoryProxyPostPr
|
||||
// Last fallback is the class of the original method.
|
||||
txAtt = findTransactionAttribute(method.getDeclaringClass());
|
||||
|
||||
if (txAtt != null) {
|
||||
if (txAtt != null || !enableDefaultTransactions) {
|
||||
return txAtt;
|
||||
}
|
||||
}
|
||||
@@ -368,6 +381,10 @@ class TransactionalRepositoryProxyPostProcessor implements RepositoryProxyPostPr
|
||||
return txAtt;
|
||||
}
|
||||
|
||||
if (!enableDefaultTransactions) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Fallback to implementation class transaction settings of nothing found
|
||||
// return findTransactionAttribute(method);
|
||||
Method targetClassMethod = repositoryInformation.getTargetClassMethod(method);
|
||||
|
||||
Reference in New Issue
Block a user