Java 抑制@ComponentScan的冲突BeanDefinitionException
我有一个Spring项目,其中多个bean可能具有相同的bean名称 为了避免冲突BeanDefinitionException,项目有一个被重写的Java 抑制@ComponentScan的冲突BeanDefinitionException,java,spring,swagger,springfox,Java,Spring,Swagger,Springfox,我有一个Spring项目,其中多个bean可能具有相同的bean名称 为了避免冲突BeanDefinitionException,项目有一个被重写的ContextNamespaceHandler public class ContextNamespaceHandler extends NamespaceHandlerSupport { @Override public void init() { registerBeanDefinitionParser("com
ContextNamespaceHandler
public class ContextNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
registerBeanDefinitionParser("component-scan", new ComponentScanBeanDefinitionParser() {
@Override
protected ClassPathBeanDefinitionScanner createScanner(XmlReaderContext readerContext, boolean useDefaultFilters) {
return new ClassPathBeanDefinitionScanner(readerContext.getRegistry(), useDefaultFilters) {
@Override
protected boolean checkCandidate(String beanName, BeanDefinition beanDefinition) throws IllegalStateException {
return true;
}
};
}
});
}
}
我正在使用Swagger/Springfox为项目生成API文档
@Configuration
@EnableWebMvc
@EnableSwagger2
@ComponentScan(basePackages = { "some.package", "some.other.package" })
public class SwaggerConfig {
// ...
}
@ComponentScan
正在导致冲突BeanDefinitionException
,因为它使用的是默认的类路径BeanDefinitionScanner
,而不是覆盖的扫描程序
Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'xxx' for bean class [xxx] conflicts with existing, non-compatible bean definition of same name and class [xxx]
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:320)
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:259)
at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:140)
at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:262)
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:226)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:193)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:163)
... 22 more
是否有一种方法可以覆盖
@ComponentScan
使用的ClassPathBeanDefinitionScanner
,或者有其他方法来抑制冲突BeanDefinitionException
?这里的最佳方法通常是通过在注释中指定bean名称来使每个bean名称唯一,即:
@Service("someService")
现在,您可以指定自动关联时要使用的bean的名称:
@Autowired
@Qualifier("someService")
即使存在泛型对象的重写组件,也最好指定一个名称以明确区分。抑制异常通常被认为是不好的做法。希望这有帮助 为什么会有多个具有相同定义的bean?@JeremyGrand这是一个分为通用部分和多个客户特定部分的项目。客户特定部件中的某些组件可能会覆盖通用部件。bean名称/id是唯一的,您可能需要重新考虑客户特定部件如何覆盖通用部件。但这些其他答案可能会有所帮助:以及