Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抑制@ComponentScan的冲突BeanDefinitionException_Java_Spring_Swagger_Springfox - Fatal编程技术网

Java 抑制@ComponentScan的冲突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

我有一个Spring项目,其中多个bean可能具有相同的bean名称

为了避免冲突BeanDefinitionException,项目有一个被重写的
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是唯一的,您可能需要重新考虑客户特定部件如何覆盖通用部件。但这些其他答案可能会有所帮助:以及