Browse Source

Restore default transaction manager by name lookup

Fix a regression introduced by 961574bd17 that prevents a proper lookup
of the default transaction manager by name as the absence of a qualifier
is represented by an empty string (passing the faulty null check).

Issue: SPR-12577
pull/717/head
Stephane Nicoll 11 years ago
parent
commit
a79fe25917
  1. 24
      spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java
  2. 60
      spring-tx/src/test/java/org/springframework/transaction/interceptor/TransactionInterceptorTests.java

24
spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java

@ -353,16 +353,12 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init
if (txAttr == null || this.beanFactory == null) { if (txAttr == null || this.beanFactory == null) {
return getTransactionManager(); return getTransactionManager();
} }
String qualifier = (txAttr.getQualifier() != null ? String qualifier = txAttr.getQualifier();
txAttr.getQualifier() : this.transactionManagerBeanName);
if (StringUtils.hasText(qualifier)) { if (StringUtils.hasText(qualifier)) {
PlatformTransactionManager txManager = this.transactionManagerCache.get(qualifier); return determineQualifiedTransactionManager(qualifier);
if (txManager == null) { }
txManager = BeanFactoryAnnotationUtils.qualifiedBeanOfType( else if (StringUtils.hasText(this.transactionManagerBeanName)) {
this.beanFactory, PlatformTransactionManager.class, qualifier); return determineQualifiedTransactionManager(this.transactionManagerBeanName);
this.transactionManagerCache.putIfAbsent(qualifier, txManager);
}
return txManager;
} }
else { else {
PlatformTransactionManager defaultTransactionManager = getTransactionManager(); PlatformTransactionManager defaultTransactionManager = getTransactionManager();
@ -375,6 +371,16 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init
} }
} }
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 * Convenience method to return a String representation of this Method
* for use in logging. Can be overridden in subclasses to provide a * for use in logging. Can be overridden in subclasses to provide a

60
spring-tx/src/test/java/org/springframework/transaction/interceptor/TransactionInterceptorTests.java

@ -126,7 +126,7 @@ public class TransactionInterceptorTests extends AbstractTransactionAspectTests
@Test @Test
public void determineTransactionManagerWithNoBeanFactory() { public void determineTransactionManagerWithNoBeanFactory() {
PlatformTransactionManager transactionManager = mock(PlatformTransactionManager.class); PlatformTransactionManager transactionManager = mock(PlatformTransactionManager.class);
TransactionInterceptor ti = createTestTransactionInterceptor(null, transactionManager); TransactionInterceptor ti = transactionInterceptorWithTransactionManager(transactionManager, null);
assertSame(transactionManager, ti.determineTransactionManager(new DefaultTransactionAttribute())); assertSame(transactionManager, ti.determineTransactionManager(new DefaultTransactionAttribute()));
} }
@ -134,7 +134,7 @@ public class TransactionInterceptorTests extends AbstractTransactionAspectTests
@Test @Test
public void determineTransactionManagerWithNoBeanFactoryAndNoTransactionAttribute() { public void determineTransactionManagerWithNoBeanFactoryAndNoTransactionAttribute() {
PlatformTransactionManager transactionManager = mock(PlatformTransactionManager.class); PlatformTransactionManager transactionManager = mock(PlatformTransactionManager.class);
TransactionInterceptor ti = createTestTransactionInterceptor(null, transactionManager); TransactionInterceptor ti = transactionInterceptorWithTransactionManager(transactionManager, null);
assertSame(transactionManager, ti.determineTransactionManager(null)); assertSame(transactionManager, ti.determineTransactionManager(null));
} }
@ -142,7 +142,7 @@ public class TransactionInterceptorTests extends AbstractTransactionAspectTests
@Test @Test
public void determineTransactionManagerWithNoTransactionAttribute() { public void determineTransactionManagerWithNoTransactionAttribute() {
BeanFactory beanFactory = mock(BeanFactory.class); BeanFactory beanFactory = mock(BeanFactory.class);
TransactionInterceptor ti = createTestTransactionInterceptor(beanFactory, null); TransactionInterceptor ti = simpleTransactionInterceptor(beanFactory);
assertNull(ti.determineTransactionManager(null)); assertNull(ti.determineTransactionManager(null));
} }
@ -150,7 +150,7 @@ public class TransactionInterceptorTests extends AbstractTransactionAspectTests
@Test @Test
public void determineTransactionManagerWithQualifierUnknown() { public void determineTransactionManagerWithQualifierUnknown() {
BeanFactory beanFactory = mock(BeanFactory.class); BeanFactory beanFactory = mock(BeanFactory.class);
TransactionInterceptor ti = createTestTransactionInterceptor(beanFactory); TransactionInterceptor ti = simpleTransactionInterceptor(beanFactory);
DefaultTransactionAttribute attribute = new DefaultTransactionAttribute(); DefaultTransactionAttribute attribute = new DefaultTransactionAttribute();
attribute.setQualifier("fooTransactionManager"); attribute.setQualifier("fooTransactionManager");
@ -163,7 +163,7 @@ public class TransactionInterceptorTests extends AbstractTransactionAspectTests
public void determineTransactionManagerWithQualifierAndDefault() { public void determineTransactionManagerWithQualifierAndDefault() {
BeanFactory beanFactory = mock(BeanFactory.class); BeanFactory beanFactory = mock(BeanFactory.class);
PlatformTransactionManager transactionManager = mock(PlatformTransactionManager.class); PlatformTransactionManager transactionManager = mock(PlatformTransactionManager.class);
TransactionInterceptor ti = createTestTransactionInterceptor(beanFactory, transactionManager); TransactionInterceptor ti = transactionInterceptorWithTransactionManager(transactionManager, beanFactory);
PlatformTransactionManager fooTransactionManager = PlatformTransactionManager fooTransactionManager =
associateTransactionManager(beanFactory, "fooTransactionManager"); associateTransactionManager(beanFactory, "fooTransactionManager");
@ -177,8 +177,8 @@ public class TransactionInterceptorTests extends AbstractTransactionAspectTests
public void determineTransactionManagerWithQualifierAndDefaultName() { public void determineTransactionManagerWithQualifierAndDefaultName() {
BeanFactory beanFactory = mock(BeanFactory.class); BeanFactory beanFactory = mock(BeanFactory.class);
associateTransactionManager(beanFactory, "defaultTransactionManager"); associateTransactionManager(beanFactory, "defaultTransactionManager");
TransactionInterceptor ti = createTestTransactionInterceptor(beanFactory); TransactionInterceptor ti = transactionInterceptorWithTransactionManagerName(
ti.setTransactionManagerBeanName("defaultTransactionManager"); "defaultTransactionManager", beanFactory);
PlatformTransactionManager fooTransactionManager = PlatformTransactionManager fooTransactionManager =
associateTransactionManager(beanFactory, "fooTransactionManager"); associateTransactionManager(beanFactory, "fooTransactionManager");
@ -188,10 +188,24 @@ public class TransactionInterceptorTests extends AbstractTransactionAspectTests
assertSame(fooTransactionManager, ti.determineTransactionManager(attribute)); assertSame(fooTransactionManager, ti.determineTransactionManager(attribute));
} }
@Test
public void determineTransactionManagerWithEmptyQualifierAndDefaultName() {
BeanFactory beanFactory = mock(BeanFactory.class);
PlatformTransactionManager defaultTransactionManager
= associateTransactionManager(beanFactory, "defaultTransactionManager");
TransactionInterceptor ti = transactionInterceptorWithTransactionManagerName(
"defaultTransactionManager", beanFactory);
DefaultTransactionAttribute attribute = new DefaultTransactionAttribute();
attribute.setQualifier("");
assertSame(defaultTransactionManager, ti.determineTransactionManager(attribute));
}
@Test @Test
public void determineTransactionManagerWithQualifierSeveralTimes() { public void determineTransactionManagerWithQualifierSeveralTimes() {
BeanFactory beanFactory = mock(BeanFactory.class); BeanFactory beanFactory = mock(BeanFactory.class);
TransactionInterceptor ti = createTestTransactionInterceptor(beanFactory); TransactionInterceptor ti = simpleTransactionInterceptor(beanFactory);
PlatformTransactionManager txManager = associateTransactionManager(beanFactory, "fooTransactionManager"); PlatformTransactionManager txManager = associateTransactionManager(beanFactory, "fooTransactionManager");
@ -210,8 +224,8 @@ public class TransactionInterceptorTests extends AbstractTransactionAspectTests
@Test @Test
public void determineTransactionManagerWithBeanNameSeveralTimes() { public void determineTransactionManagerWithBeanNameSeveralTimes() {
BeanFactory beanFactory = mock(BeanFactory.class); BeanFactory beanFactory = mock(BeanFactory.class);
TransactionInterceptor ti = createTestTransactionInterceptor(beanFactory); TransactionInterceptor ti = transactionInterceptorWithTransactionManagerName(
ti.setTransactionManagerBeanName("fooTransactionManager"); "fooTransactionManager", beanFactory);
PlatformTransactionManager txManager = associateTransactionManager(beanFactory, "fooTransactionManager"); PlatformTransactionManager txManager = associateTransactionManager(beanFactory, "fooTransactionManager");
@ -228,7 +242,7 @@ public class TransactionInterceptorTests extends AbstractTransactionAspectTests
@Test @Test
public void determineTransactionManagerDefaultSeveralTimes() { public void determineTransactionManagerDefaultSeveralTimes() {
BeanFactory beanFactory = mock(BeanFactory.class); BeanFactory beanFactory = mock(BeanFactory.class);
TransactionInterceptor ti = createTestTransactionInterceptor(beanFactory); TransactionInterceptor ti = simpleTransactionInterceptor(beanFactory);
PlatformTransactionManager txManager = mock(PlatformTransactionManager.class); PlatformTransactionManager txManager = mock(PlatformTransactionManager.class);
given(beanFactory.getBean(PlatformTransactionManager.class)).willReturn(txManager); given(beanFactory.getBean(PlatformTransactionManager.class)).willReturn(txManager);
@ -243,12 +257,16 @@ public class TransactionInterceptorTests extends AbstractTransactionAspectTests
verify(beanFactory, times(1)).getBean(PlatformTransactionManager.class); verify(beanFactory, times(1)).getBean(PlatformTransactionManager.class);
} }
private TransactionInterceptor createTestTransactionInterceptor(BeanFactory beanFactory, private TransactionInterceptor createTransactionInterceptor(BeanFactory beanFactory,
PlatformTransactionManager transactionManager) { String transactionManagerName, PlatformTransactionManager transactionManager) {
TransactionInterceptor ti = new TransactionInterceptor(); TransactionInterceptor ti = new TransactionInterceptor();
if (beanFactory != null) { if (beanFactory != null) {
ti.setBeanFactory(beanFactory); ti.setBeanFactory(beanFactory);
} }
if (transactionManagerName != null) {
ti.setTransactionManagerBeanName(transactionManagerName);
}
if (transactionManager != null) { if (transactionManager != null) {
ti.setTransactionManager(transactionManager); ti.setTransactionManager(transactionManager);
} }
@ -257,8 +275,20 @@ public class TransactionInterceptorTests extends AbstractTransactionAspectTests
return ti; return ti;
} }
private TransactionInterceptor createTestTransactionInterceptor(BeanFactory beanFactory) { private TransactionInterceptor transactionInterceptorWithTransactionManager(
return createTestTransactionInterceptor(beanFactory, null); PlatformTransactionManager transactionManager, BeanFactory beanFactory) {
return createTransactionInterceptor(beanFactory, null, transactionManager);
}
private TransactionInterceptor transactionInterceptorWithTransactionManagerName(
String transactionManagerName, BeanFactory beanFactory) {
return createTransactionInterceptor(beanFactory, transactionManagerName, null);
}
private TransactionInterceptor simpleTransactionInterceptor(BeanFactory beanFactory) {
return createTransactionInterceptor(beanFactory, null, null);
} }
private PlatformTransactionManager associateTransactionManager(BeanFactory beanFactory, String name) { private PlatformTransactionManager associateTransactionManager(BeanFactory beanFactory, String name) {

Loading…
Cancel
Save