2016-10-26 2 views
0

나는, 나는 다음과 같은 오류가 두 개의 정의 된 구성 요소Spring : 확장 된 bean이 조상과 호환되지 않는 경우는 언제입니까?

클래스 A

package a; 

@Component 
@Order(Ordered.HIGHEST_PRECEDENCE) 
class A extends OncePerRequestFilter { 

클래스 B

package b; 

@Component 
@Order(Ordered.HIGHEST_PRECEDENCE) 
@Primary 
class A extends a.A { 

내 봄이 두 가지 구성 요소를 사용 (부팅 4.2.5) 응용 프로그램을 얻고있어 :

... 
nested exception is org.springframework.context.annotation. 
ConflictingBeanDefinitionException: 
Annotation-specified bean name 'a' for bean class [a.A] conflicts with existing, 
non-compatible bean definition of same name and class [b.A] 

나는 to), b.A는 a.A를 대신하여 대체되거나 대체 될 것입니다.

왜 여기에 오류 메시지가 표시됩니까? b.A를 "구성 요소 a"로 사용하는 방법은 무엇입니까?

전체 예외/질주 부팅 시작 오류 : 다른 패키지에서 같은 콩은 지원되지 않습니다 것처럼

Application startup failed","stack_trace":"o.s.c.a.ConflictingBeanDefinitionException: 
Annotation-specified bean name 'httpAccessLogFilter' for bean class [b.A] conflicts with existing, 
non-compatible bean definition of same name and class [a.A] 
at o.s.c.a.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:320) 
at o.s.c.a.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:259) 
at o.s.c.a.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:137) 
at o.s.c.a.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:268) 
at o.s.c.a.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:232) 
at o.s.c.a.ConfigurationClassParser.parse(ConfigurationClassParser.java:199) 
at o.s.c.a.ConfigurationClassParser.parse(ConfigurationClassParser.java:168) 
... 16 common frames omitted 
Wrapped by: o.s.b.f.BeanDefinitionStoreException: Failed to parse configuration class [a.SpringBootApplication]; 
nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: A 
nnotation-specified bean name 'a' for bean class [b.A] conflicts with existing, non-compatible bean definition of same name and class [a.A] 
at o.s.c.a.ConfigurationClassParser.parse(ConfigurationClassParser.java:182) 
at o.s.c.a.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:321) 
at o.s.c.a.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:243) 
at o.s.c.s.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:273) 
at o.s.c.s.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:98) 
at o.s.c.s.AbstractApplicationContext.invokeBeanFactoryPostProcessors(Abst... 
+0

오류의 원인이되는 코드를 표시하십시오 (예 : 예외 발생시) ... – alexbt

+0

Stacktrace가 첨부되었습니다. –

답변

1

보인다. 봄에서

"considers them as compatible when the existing bean definition comes from the same source or from a non-scanning source." ClassPathBeanDefinitionScanner:isCompatible

,이 아직 이슈 트래커에서 논의, SPR-14665SPR-10808를 참조하십시오.

나는 추악한 해결 방법이 있습니다. 조상은 다른 이름을 가지며 "ConditionalOnMissingBean"주석이 붙습니다.

조상 :

package a; 

@Component 
@Order(Ordered.HIGHEST_PRECEDENCE) 
@ConditionalOnMissingBean(name = "a") 
class AncestorOfA extends OncePerRequestFilter { 

클래스 B : I는 자신의 경로를 구현하지 않으려면

package b; 

@Component 
@Order(Ordered.HIGHEST_PRECEDENCE) 
class A extends a.AncestorOfA { 

이 방법은, 내가 "ancestorOfA을"구성 요소가 있습니다. 자체 버전을 사용하려면 "ancestorOfA"가 아닌 "a"구성 요소를 갖습니다.

명백한 단점은 하위 구성 요소의 이름이 올바르게 지정되어 있다는 것입니다.

관련 문제