Fix regression in determineTransactionManager
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
This commit is contained in:
parent
a770b151d9
commit
4a0ac97550
|
@ -352,23 +352,12 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init
|
|||
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);
|
||||
|
@ -381,6 +370,16 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init
|
|||
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
|
||||
|
|
|
@ -139,6 +139,14 @@ public class TransactionInterceptorTests extends AbstractTransactionAspectTests
|
|||
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);
|
||||
|
|
Loading…
Reference in New Issue