Skip to content

Commit adec026

Browse files
committed
Restore default transaction manager by name lookup
Fix a regression introduced by 961574b 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
1 parent 8c700b1 commit adec026

File tree

2 files changed

+60
-24
lines changed

2 files changed

+60
-24
lines changed

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

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -353,16 +353,12 @@ protected PlatformTransactionManager determineTransactionManager(TransactionAttr
353353
if (txAttr == null || this.beanFactory == null) {
354354
return getTransactionManager();
355355
}
356-
String qualifier = (txAttr.getQualifier() != null ?
357-
txAttr.getQualifier() : this.transactionManagerBeanName);
356+
String qualifier = txAttr.getQualifier();
358357
if (StringUtils.hasText(qualifier)) {
359-
PlatformTransactionManager txManager = this.transactionManagerCache.get(qualifier);
360-
if (txManager == null) {
361-
txManager = BeanFactoryAnnotationUtils.qualifiedBeanOfType(
362-
this.beanFactory, PlatformTransactionManager.class, qualifier);
363-
this.transactionManagerCache.putIfAbsent(qualifier, txManager);
364-
}
365-
return txManager;
358+
return determineQualifiedTransactionManager(qualifier);
359+
}
360+
else if (StringUtils.hasText(this.transactionManagerBeanName)) {
361+
return determineQualifiedTransactionManager(this.transactionManagerBeanName);
366362
}
367363
else {
368364
PlatformTransactionManager defaultTransactionManager = getTransactionManager();
@@ -375,6 +371,16 @@ protected PlatformTransactionManager determineTransactionManager(TransactionAttr
375371
}
376372
}
377373

374+
private PlatformTransactionManager determineQualifiedTransactionManager(String qualifier) {
375+
PlatformTransactionManager txManager = this.transactionManagerCache.get(qualifier);
376+
if (txManager == null) {
377+
txManager = BeanFactoryAnnotationUtils.qualifiedBeanOfType(
378+
this.beanFactory, PlatformTransactionManager.class, qualifier);
379+
this.transactionManagerCache.putIfAbsent(qualifier, txManager);
380+
}
381+
return txManager;
382+
}
383+
378384
/**
379385
* Convenience method to return a String representation of this Method
380386
* for use in logging. Can be overridden in subclasses to provide a

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

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -126,31 +126,31 @@ public void serializableWithCompositeSource() throws Exception {
126126
@Test
127127
public void determineTransactionManagerWithNoBeanFactory() {
128128
PlatformTransactionManager transactionManager = mock(PlatformTransactionManager.class);
129-
TransactionInterceptor ti = createTestTransactionInterceptor(null, transactionManager);
129+
TransactionInterceptor ti = transactionInterceptorWithTransactionManager(transactionManager, null);
130130

131131
assertSame(transactionManager, ti.determineTransactionManager(new DefaultTransactionAttribute()));
132132
}
133133

134134
@Test
135135
public void determineTransactionManagerWithNoBeanFactoryAndNoTransactionAttribute() {
136136
PlatformTransactionManager transactionManager = mock(PlatformTransactionManager.class);
137-
TransactionInterceptor ti = createTestTransactionInterceptor(null, transactionManager);
137+
TransactionInterceptor ti = transactionInterceptorWithTransactionManager(transactionManager, null);
138138

139139
assertSame(transactionManager, ti.determineTransactionManager(null));
140140
}
141141

142142
@Test
143143
public void determineTransactionManagerWithNoTransactionAttribute() {
144144
BeanFactory beanFactory = mock(BeanFactory.class);
145-
TransactionInterceptor ti = createTestTransactionInterceptor(beanFactory, null);
145+
TransactionInterceptor ti = simpleTransactionInterceptor(beanFactory);
146146

147147
assertNull(ti.determineTransactionManager(null));
148148
}
149149

150150
@Test
151151
public void determineTransactionManagerWithQualifierUnknown() {
152152
BeanFactory beanFactory = mock(BeanFactory.class);
153-
TransactionInterceptor ti = createTestTransactionInterceptor(beanFactory);
153+
TransactionInterceptor ti = simpleTransactionInterceptor(beanFactory);
154154
DefaultTransactionAttribute attribute = new DefaultTransactionAttribute();
155155
attribute.setQualifier("fooTransactionManager");
156156

@@ -163,7 +163,7 @@ public void determineTransactionManagerWithQualifierUnknown() {
163163
public void determineTransactionManagerWithQualifierAndDefault() {
164164
BeanFactory beanFactory = mock(BeanFactory.class);
165165
PlatformTransactionManager transactionManager = mock(PlatformTransactionManager.class);
166-
TransactionInterceptor ti = createTestTransactionInterceptor(beanFactory, transactionManager);
166+
TransactionInterceptor ti = transactionInterceptorWithTransactionManager(transactionManager, beanFactory);
167167
PlatformTransactionManager fooTransactionManager =
168168
associateTransactionManager(beanFactory, "fooTransactionManager");
169169

@@ -177,8 +177,8 @@ public void determineTransactionManagerWithQualifierAndDefault() {
177177
public void determineTransactionManagerWithQualifierAndDefaultName() {
178178
BeanFactory beanFactory = mock(BeanFactory.class);
179179
associateTransactionManager(beanFactory, "defaultTransactionManager");
180-
TransactionInterceptor ti = createTestTransactionInterceptor(beanFactory);
181-
ti.setTransactionManagerBeanName("defaultTransactionManager");
180+
TransactionInterceptor ti = transactionInterceptorWithTransactionManagerName(
181+
"defaultTransactionManager", beanFactory);
182182

183183
PlatformTransactionManager fooTransactionManager =
184184
associateTransactionManager(beanFactory, "fooTransactionManager");
@@ -188,10 +188,24 @@ public void determineTransactionManagerWithQualifierAndDefaultName() {
188188
assertSame(fooTransactionManager, ti.determineTransactionManager(attribute));
189189
}
190190

191+
@Test
192+
public void determineTransactionManagerWithEmptyQualifierAndDefaultName() {
193+
BeanFactory beanFactory = mock(BeanFactory.class);
194+
PlatformTransactionManager defaultTransactionManager
195+
= associateTransactionManager(beanFactory, "defaultTransactionManager");
196+
TransactionInterceptor ti = transactionInterceptorWithTransactionManagerName(
197+
"defaultTransactionManager", beanFactory);
198+
199+
DefaultTransactionAttribute attribute = new DefaultTransactionAttribute();
200+
attribute.setQualifier("");
201+
202+
assertSame(defaultTransactionManager, ti.determineTransactionManager(attribute));
203+
}
204+
191205
@Test
192206
public void determineTransactionManagerWithQualifierSeveralTimes() {
193207
BeanFactory beanFactory = mock(BeanFactory.class);
194-
TransactionInterceptor ti = createTestTransactionInterceptor(beanFactory);
208+
TransactionInterceptor ti = simpleTransactionInterceptor(beanFactory);
195209

196210
PlatformTransactionManager txManager = associateTransactionManager(beanFactory, "fooTransactionManager");
197211

@@ -210,8 +224,8 @@ public void determineTransactionManagerWithQualifierSeveralTimes() {
210224
@Test
211225
public void determineTransactionManagerWithBeanNameSeveralTimes() {
212226
BeanFactory beanFactory = mock(BeanFactory.class);
213-
TransactionInterceptor ti = createTestTransactionInterceptor(beanFactory);
214-
ti.setTransactionManagerBeanName("fooTransactionManager");
227+
TransactionInterceptor ti = transactionInterceptorWithTransactionManagerName(
228+
"fooTransactionManager", beanFactory);
215229

216230
PlatformTransactionManager txManager = associateTransactionManager(beanFactory, "fooTransactionManager");
217231

@@ -228,7 +242,7 @@ public void determineTransactionManagerWithBeanNameSeveralTimes() {
228242
@Test
229243
public void determineTransactionManagerDefaultSeveralTimes() {
230244
BeanFactory beanFactory = mock(BeanFactory.class);
231-
TransactionInterceptor ti = createTestTransactionInterceptor(beanFactory);
245+
TransactionInterceptor ti = simpleTransactionInterceptor(beanFactory);
232246

233247
PlatformTransactionManager txManager = mock(PlatformTransactionManager.class);
234248
given(beanFactory.getBean(PlatformTransactionManager.class)).willReturn(txManager);
@@ -243,12 +257,16 @@ public void determineTransactionManagerDefaultSeveralTimes() {
243257
verify(beanFactory, times(1)).getBean(PlatformTransactionManager.class);
244258
}
245259

246-
private TransactionInterceptor createTestTransactionInterceptor(BeanFactory beanFactory,
247-
PlatformTransactionManager transactionManager) {
260+
private TransactionInterceptor createTransactionInterceptor(BeanFactory beanFactory,
261+
String transactionManagerName, PlatformTransactionManager transactionManager) {
248262
TransactionInterceptor ti = new TransactionInterceptor();
249263
if (beanFactory != null) {
250264
ti.setBeanFactory(beanFactory);
251265
}
266+
if (transactionManagerName != null) {
267+
ti.setTransactionManagerBeanName(transactionManagerName);
268+
269+
}
252270
if (transactionManager != null) {
253271
ti.setTransactionManager(transactionManager);
254272
}
@@ -257,8 +275,20 @@ private TransactionInterceptor createTestTransactionInterceptor(BeanFactory bean
257275
return ti;
258276
}
259277

260-
private TransactionInterceptor createTestTransactionInterceptor(BeanFactory beanFactory) {
261-
return createTestTransactionInterceptor(beanFactory, null);
278+
private TransactionInterceptor transactionInterceptorWithTransactionManager(
279+
PlatformTransactionManager transactionManager, BeanFactory beanFactory) {
280+
281+
return createTransactionInterceptor(beanFactory, null, transactionManager);
282+
}
283+
284+
private TransactionInterceptor transactionInterceptorWithTransactionManagerName(
285+
String transactionManagerName, BeanFactory beanFactory) {
286+
287+
return createTransactionInterceptor(beanFactory, transactionManagerName, null);
288+
}
289+
290+
private TransactionInterceptor simpleTransactionInterceptor(BeanFactory beanFactory) {
291+
return createTransactionInterceptor(beanFactory, null, null);
262292
}
263293

264294
private PlatformTransactionManager associateTransactionManager(BeanFactory beanFactory, String name) {

0 commit comments

Comments
 (0)