Skip to content

Commit

Permalink
Fix regression in determineTransactionManager
Browse files Browse the repository at this point in the history
The fix in cec26e9 for SPR-12541 actually introduced a regression
when the interceptor is enabled on a method that does not require any
transaction. In such a case we try to locate the default
PlatformTransactionManager instead of just returning what we have (that
is null).

This commit updates the determineTransactionManager condition again to
take that use case into account again.

Issue: SPR-12541
  • Loading branch information
snicoll committed Dec 28, 2014
1 parent a770b15 commit 4a0ac97
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -352,23 +352,12 @@ protected PlatformTransactionManager determineTransactionManager(TransactionAttr
if (this.beanFactory != null) {
String qualifier = txAttr != null ? txAttr.getQualifier() : null;
if (StringUtils.hasText(qualifier)) {
PlatformTransactionManager txManager = this.transactionManagerCache.get(qualifier);
if (txManager == null) {
txManager = BeanFactoryAnnotationUtils.qualifiedBeanOfType(
this.beanFactory, PlatformTransactionManager.class, qualifier);
this.transactionManagerCache.putIfAbsent(qualifier, txManager);
}
return txManager;
return determineQualifiedTransactionManager(qualifier);
}
else if (StringUtils.hasText(this.transactionManagerBeanName)) {
PlatformTransactionManager txManager = this.transactionManagerCache.get(this.transactionManagerBeanName);
if (txManager == null) {
txManager = this.beanFactory.getBean(
this.transactionManagerBeanName, PlatformTransactionManager.class);
this.transactionManagerCache.putIfAbsent(this.transactionManagerBeanName, txManager);
}
return txManager;
} else {
return determineQualifiedTransactionManager(this.transactionManagerBeanName);
}
else if (txAttr != null) { // Do not lookup default bean name if no tx attributes are set
PlatformTransactionManager defaultTransactionManager = getTransactionManager();
if (defaultTransactionManager == null) {
defaultTransactionManager = this.beanFactory.getBean(PlatformTransactionManager.class);
Expand All @@ -381,6 +370,16 @@ else if (StringUtils.hasText(this.transactionManagerBeanName)) {
return getTransactionManager();
}

private PlatformTransactionManager determineQualifiedTransactionManager(String qualifier) {
PlatformTransactionManager txManager = this.transactionManagerCache.get(qualifier);
if (txManager == null) {
txManager = BeanFactoryAnnotationUtils.qualifiedBeanOfType(
this.beanFactory, PlatformTransactionManager.class, qualifier);
this.transactionManagerCache.putIfAbsent(qualifier, txManager);
}
return txManager;
}

/**
* Convenience method to return a String representation of this Method
* for use in logging. Can be overridden in subclasses to provide a
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,14 @@ public void determineTransactionManagerWithNoBeanFactoryAndNoTransactionAttribut
assertSame(transactionManager, ti.determineTransactionManager(null));
}

@Test
public void determineTransactionManagerWithNoTransactionAttribute() {
BeanFactory beanFactory = mock(BeanFactory.class);
TransactionInterceptor ti = createTestTransactionInterceptor(beanFactory, null);

assertNull(ti.determineTransactionManager(null));
}

@Test
public void determineTransactionManagerWithQualifierUnknown() {
BeanFactory beanFactory = mock(BeanFactory.class);
Expand Down

0 comments on commit 4a0ac97

Please sign in to comment.