Skip to content

Commit b678611

Browse files
committed
Ignore BeanNotOfRequiredTypeException as well as NoSuchBeanDefinitionException
Closes GH-34187
1 parent b6de2b0 commit b678611

File tree

2 files changed

+75
-3
lines changed

2 files changed

+75
-3
lines changed

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2024 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -31,6 +31,7 @@
3131

3232
import org.springframework.beans.factory.BeanFactory;
3333
import org.springframework.beans.factory.BeanFactoryAware;
34+
import org.springframework.beans.factory.BeanNotOfRequiredTypeException;
3435
import org.springframework.beans.factory.InitializingBean;
3536
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
3637
import org.springframework.beans.factory.annotation.BeanFactoryAnnotationUtils;
@@ -81,6 +82,7 @@
8182
* @author Mark Paluch
8283
* @author Sebastien Deleuze
8384
* @author Enric Sala
85+
* @author Yanming Zhou
8486
* @since 1.1
8587
* @see PlatformTransactionManager
8688
* @see ReactiveTransactionManager
@@ -506,7 +508,7 @@ else if (targetClass != null) {
506508
try {
507509
return determineQualifiedTransactionManager(this.beanFactory, typeQualifier);
508510
}
509-
catch (NoSuchBeanDefinitionException ex) {
511+
catch (NoSuchBeanDefinitionException | BeanNotOfRequiredTypeException ex) {
510512
// Consider type qualifier as optional, proceed with regular resolution below.
511513
}
512514
}

Diff for: spring-tx/src/test/java/org/springframework/transaction/annotation/EnableTransactionManagementTests.java

+71-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2024 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -58,6 +58,7 @@
5858
* @author Juergen Hoeller
5959
* @author Stephane Nicoll
6060
* @author Sam Brannen
61+
* @author Yanming Zhou
6162
* @since 3.1
6263
*/
6364
class EnableTransactionManagementTests {
@@ -287,6 +288,34 @@ void gh24291TransactionManagerViaQualifierAnnotation() {
287288
ctx.close();
288289
}
289290

291+
@Test
292+
void transactionManagerViaQualifierAnnotationWithNoSuchBeanDefinitionException() {
293+
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Gh34187Config.class);
294+
TransactionalTestBeanWithNonExistentQualifier bean = ctx.getBean(TransactionalTestBeanWithNonExistentQualifier.class);
295+
CallCountingTransactionManager txManager = ctx.getBean("txManager", CallCountingTransactionManager.class);
296+
297+
bean.findAllFoos();
298+
assertThat(txManager.begun).isEqualTo(1);
299+
assertThat(txManager.commits).isEqualTo(1);
300+
assertThat(txManager.rollbacks).isEqualTo(0);
301+
302+
ctx.close();
303+
}
304+
305+
@Test
306+
void transactionManagerViaQualifierAnnotationWithBeanNotOfRequiredTypeException() {
307+
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Gh34187Config.class);
308+
TransactionalTestBeanWithInvalidQualifier bean = ctx.getBean(TransactionalTestBeanWithInvalidQualifier.class);
309+
CallCountingTransactionManager txManager = ctx.getBean("txManager", CallCountingTransactionManager.class);
310+
311+
bean.findAllFoos();
312+
assertThat(txManager.begun).isEqualTo(1);
313+
assertThat(txManager.commits).isEqualTo(1);
314+
assertThat(txManager.rollbacks).isEqualTo(0);
315+
316+
ctx.close();
317+
}
318+
290319
@Test
291320
void spr14322AnnotationOnInterfaceWithInterfaceProxy() {
292321
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Spr14322ConfigA.class);
@@ -386,6 +415,17 @@ public void saveQualifiedFooWithAttributeAlias() {
386415
public static class TransactionalTestBeanSubclass extends TransactionalTestBean {
387416
}
388417

418+
@Service
419+
@Qualifier("nonExistentBean")
420+
public static class TransactionalTestBeanWithNonExistentQualifier extends TransactionalTestBean {
421+
}
422+
423+
@Service
424+
@Qualifier("transactionalTestBeanWithInvalidQualifier")
425+
public static class TransactionalTestBeanWithInvalidQualifier extends TransactionalTestBean {
426+
}
427+
428+
389429

390430
@Configuration
391431
static class PlaceholderConfig {
@@ -601,6 +641,36 @@ public CallCountingTransactionManager otherTxManager() {
601641
}
602642
}
603643

644+
@Configuration
645+
@EnableTransactionManagement
646+
@Import(PlaceholderConfig.class)
647+
static class Gh34187Config {
648+
649+
@Autowired
650+
public void initializeApp(ConfigurableApplicationContext applicationContext) {
651+
applicationContext.getBeanFactory().registerSingleton(
652+
"qualifiedTransactionManager", new CallCountingTransactionManager());
653+
applicationContext.getBeanFactory().registerAlias("qualifiedTransactionManager", "qualified");
654+
}
655+
656+
@Bean
657+
public TransactionalTestBeanWithNonExistentQualifier transactionalTestBeanWithNonExistentQualifier() {
658+
return new TransactionalTestBeanWithNonExistentQualifier();
659+
}
660+
661+
@Bean
662+
public TransactionalTestBeanWithInvalidQualifier transactionalTestBeanWithInvalidQualifier() {
663+
return new TransactionalTestBeanWithInvalidQualifier();
664+
}
665+
666+
@Bean
667+
@Primary
668+
public CallCountingTransactionManager txManager() {
669+
return new CallCountingTransactionManager();
670+
}
671+
}
672+
673+
604674

605675
public interface BaseTransactionalInterface {
606676

0 commit comments

Comments
 (0)