Reject multiple primary candidates in ancestor factory as well
Closes gh-26612
This commit is contained in:
		
							parent
							
								
									ad2e95be4b
								
							
						
					
					
						commit
						889c4e0ff5
					
				|  | @ -1805,7 +1805,7 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto | ||||||
| 				if (primaryBeanName != null) { | 				if (primaryBeanName != null) { | ||||||
| 					boolean candidateLocal = containsBeanDefinition(candidateBeanName); | 					boolean candidateLocal = containsBeanDefinition(candidateBeanName); | ||||||
| 					boolean primaryLocal = containsBeanDefinition(primaryBeanName); | 					boolean primaryLocal = containsBeanDefinition(primaryBeanName); | ||||||
| 					if (candidateLocal && primaryLocal) { | 					if (candidateLocal == primaryLocal) { | ||||||
| 						throw new NoUniqueBeanDefinitionException(requiredType, candidates.size(), | 						throw new NoUniqueBeanDefinitionException(requiredType, candidates.size(), | ||||||
| 								"more than one 'primary' bean found among candidates: " + candidates.keySet()); | 								"more than one 'primary' bean found among candidates: " + candidates.keySet()); | ||||||
| 					} | 					} | ||||||
|  |  | ||||||
|  | @ -2163,9 +2163,39 @@ class DefaultListableBeanFactoryTests { | ||||||
| 		lbf.registerBeanDefinition("test", bd); | 		lbf.registerBeanDefinition("test", bd); | ||||||
| 		lbf.registerBeanDefinition("spouse", bd2); | 		lbf.registerBeanDefinition("spouse", bd2); | ||||||
| 
 | 
 | ||||||
| 		assertThatExceptionOfType(UnsatisfiedDependencyException.class).isThrownBy(() -> | 		assertThatExceptionOfType(UnsatisfiedDependencyException.class) | ||||||
| 				lbf.autowire(DependenciesBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true)) | 				.isThrownBy(() -> lbf.autowire(DependenciesBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true)) | ||||||
| 			.withCauseExactlyInstanceOf(NoUniqueBeanDefinitionException.class); | 				.withCauseExactlyInstanceOf(NoUniqueBeanDefinitionException.class); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Test | ||||||
|  | 	void autowireBeanByTypeWithTwoPrimaryCandidatesInOneAncestor() { | ||||||
|  | 		DefaultListableBeanFactory parent = new DefaultListableBeanFactory(); | ||||||
|  | 		RootBeanDefinition bd = new RootBeanDefinition(TestBean.class); | ||||||
|  | 		bd.setPrimary(true); | ||||||
|  | 		RootBeanDefinition bd2 = new RootBeanDefinition(TestBean.class); | ||||||
|  | 		bd2.setPrimary(true); | ||||||
|  | 		parent.registerBeanDefinition("test", bd); | ||||||
|  | 		parent.registerBeanDefinition("spouse", bd2); | ||||||
|  | 		DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(parent); | ||||||
|  | 
 | ||||||
|  | 		assertThatExceptionOfType(UnsatisfiedDependencyException.class) | ||||||
|  | 				.isThrownBy(() -> lbf.autowire(DependenciesBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true)) | ||||||
|  | 				.withCauseExactlyInstanceOf(NoUniqueBeanDefinitionException.class); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Test | ||||||
|  | 	void autowireBeanByTypeWithTwoPrimaryFactoryBeans(){ | ||||||
|  | 		DefaultListableBeanFactory lbf = new DefaultListableBeanFactory(); | ||||||
|  | 		RootBeanDefinition bd1 = new RootBeanDefinition(LazyInitFactory.class); | ||||||
|  | 		RootBeanDefinition bd2 = new RootBeanDefinition(LazyInitFactory.class); | ||||||
|  | 		bd1.setPrimary(true); | ||||||
|  | 		bd2.setPrimary(true); | ||||||
|  | 		lbf.registerBeanDefinition("bd1", bd1); | ||||||
|  | 		lbf.registerBeanDefinition("bd2", bd2); | ||||||
|  | 		assertThatExceptionOfType(UnsatisfiedDependencyException.class) | ||||||
|  | 				.isThrownBy(() -> lbf.autowire(FactoryBeanDependentBean.class, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true)) | ||||||
|  | 				.withCauseExactlyInstanceOf(NoUniqueBeanDefinitionException.class); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	@Test | 	@Test | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue