Spring ConflictingBeanDefinitionException

时间:2015-12-26 18:33:03

标签: spring javabeans

我有ProjectA定义MyService类。 ProjectA包含多个具体服务,例如:SomeService

现在我有了ProjectB,这是一个Spring引导项目,它将ProjectA作为依赖项。 ProjectB可以通过定义自己的SomeServicepublic class SomeService extends project.a.SomeService {...}添加一些功能。通过@ImportResource("applicationContext.xml")扫描bean。

的applicationContext.xml:

<beans ...>
<context:component-scan base-package="project">
    <context:include-filter type="assignable"
        expression="project.a.MyService" />
</context:component-scan>
</beans>

主要问题是:这会导致ConflictingBeanDefinitionException:

Annotation-specified bean name 'someService' for bean class
[project.a.SomeService] conflicts with existing, 
non-compatible bean definition of same name and class [project.b.SomeService]

虽然异常非常清楚,但我不知道如何解决它。
在我的研究之后,我相信setAllowBeanDefinitionOverriding(true)应该解决我的问题。也许我只是在错误的时间做,但它从来没有帮助(我认为这是默认值)。

我的尝试:
我试图避免所有扫描并自己注册我的bean:

GenericApplicationContext ctx = (GenericApplicationContext) SpringApplication.run(ProjectBApplication.class, args); 
ctx.getBeanFactory().registerSingleton("someService", new project.b.SomeService());
...

我可以通过这种方式过滤MyService,但现在我在其他(以下!)bean中使用SomeService运行自动装配问题。 也许我只是注册someService bean错了?

我已经读过有关BeanPostProcessors的内容,但我没有得到他们如何帮助我以及在哪里正确使用它们。

请记住:任何解决方案都适合,无论是否在xml中过滤MyService代码,只需告诉spring覆盖具有更具体或更具特色的bean。

1 个答案:

答案 0 :(得分:0)

我发现我刚刚注册了错误的bean。使用

GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(service);
context.registerBeanDefinition(beanName, beanDefinition);

解决了自动装配问题,目前一切正常。