Fix regression in determineTransactionManager

One more (and hopefully last) attempt at making sure
determineTransactionManager does not break existing use cases.

This commit prevents any lookup if no transaction attributes are set
which is more compliant with the original version and prevents a lookup
if a non existing bean name is provided explicitly (as it can be the case
with Spring Boot).

Issue: SPR-12541
master
Stephane Nicoll 10 years ago
parent 4a0ac97550
commit 961574bd17
  1. 47
      spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java

@ -349,35 +349,30 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init
* Determine the specific transaction manager to use for the given transaction. * Determine the specific transaction manager to use for the given transaction.
*/ */
protected PlatformTransactionManager determineTransactionManager(TransactionAttribute txAttr) { protected PlatformTransactionManager determineTransactionManager(TransactionAttribute txAttr) {
if (this.beanFactory != null) { // Do not attempt to lookup tx manager if no tx attributes are set
String qualifier = txAttr != null ? txAttr.getQualifier() : null; if (txAttr == null || this.beanFactory == null) {
if (StringUtils.hasText(qualifier)) { return getTransactionManager();
return determineQualifiedTransactionManager(qualifier); }
} String qualifier = (txAttr.getQualifier() != null ?
else if (StringUtils.hasText(this.transactionManagerBeanName)) { txAttr.getQualifier() : this.transactionManagerBeanName);
return determineQualifiedTransactionManager(this.transactionManagerBeanName); if (StringUtils.hasText(qualifier)) {
} PlatformTransactionManager txManager = this.transactionManagerCache.get(qualifier);
else if (txAttr != null) { // Do not lookup default bean name if no tx attributes are set if (txManager == null) {
PlatformTransactionManager defaultTransactionManager = getTransactionManager(); txManager = BeanFactoryAnnotationUtils.qualifiedBeanOfType(
if (defaultTransactionManager == null) { this.beanFactory, PlatformTransactionManager.class, qualifier);
defaultTransactionManager = this.beanFactory.getBean(PlatformTransactionManager.class); this.transactionManagerCache.putIfAbsent(qualifier, txManager);
this.transactionManagerCache.putIfAbsent(
DEFAULT_TRANSACTION_MANAGER_KEY, defaultTransactionManager);
}
return defaultTransactionManager;
} }
return txManager;
} }
return getTransactionManager(); else {
} PlatformTransactionManager defaultTransactionManager = getTransactionManager();
if (defaultTransactionManager == null) {
private PlatformTransactionManager determineQualifiedTransactionManager(String qualifier) { defaultTransactionManager = this.beanFactory.getBean(PlatformTransactionManager.class);
PlatformTransactionManager txManager = this.transactionManagerCache.get(qualifier); this.transactionManagerCache.putIfAbsent(
if (txManager == null) { DEFAULT_TRANSACTION_MANAGER_KEY, defaultTransactionManager);
txManager = BeanFactoryAnnotationUtils.qualifiedBeanOfType( }
this.beanFactory, PlatformTransactionManager.class, qualifier); return defaultTransactionManager;
this.transactionManagerCache.putIfAbsent(qualifier, txManager);
} }
return txManager;
} }
/** /**

Loading…
Cancel
Save