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:
Oliver Gierke
2015-06-22 17:04:45 +02:00
parent e0dafd29f4
commit ac2faab0d2
4 changed files with 43 additions and 13 deletions

View File

@@ -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);
}
}

View File

@@ -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);