注释指定的bean名称与现有的,不兼容的bean def冲突

use*_*068 49 spring repository

我遇到一些Spring bean定义的问题.我有几个由我的main()方法加载的上下文xml文件,它们都包含几乎只有一个标记.当我的main方法启动时,我从Spring得到这个错误:

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'converterDAO' for bean class [my.package.InMemoryConverterDaoImpl] conflicts with existing, non-compatible bean definition of same name and class [my.other.package.StaticConverterDAOImpl]
Run Code Online (Sandbox Code Playgroud)

这两个DAO类都以这种方式注释:

@Repository("converterDAO")
public class StaticConverterDAOImpl implements ConverterDAO {
...
}
Run Code Online (Sandbox Code Playgroud)

内存中的dao也有@Repository("converterDAO")注释.dao在其他类中被引用,如下所示:

...
private @Autowired @Qualifier("converterDAO") ConverterDAO converterDAO;
...
Run Code Online (Sandbox Code Playgroud)

我想要一个DAO覆盖另一个DAO的定义,正如我一直认为这是首先使用DI框架的主要原因之一.多年来我一直用xml定义做这件事,从来没有遇到任何问题.但是组件扫描和带注释的bean定义却不是这样吗?当Spring说它们不兼容时,它意味着什么呢?它们实现相同的接口,并且它们被自动装配到该接口类型的字段中.为什么他们不兼容?

有人可以为我提供一种方法,让一个带注释的,组件扫描的bean覆盖另一个吗?

-麦克风

JB *_*zet 32

在XML文件中,有一系列声明,您可以使用较新的声明覆盖先前的定义.使用注释时,没有之前之后的概念.所有豆子都处于同一水平.您定义了两个具有相同名称的bean,Spring不知道它应该选择哪个bean.

给他们一个不同的名称(staticConverterDAO,inMemoryConverterDAO为例),创建Spring的XML文件(别名theConverterDAO注入器时为例),并使用此别名:

@Autowired @Qualifier("theConverterDAO")
Run Code Online (Sandbox Code Playgroud)


use*_*261 31

我遇到了类似的问题,在一个项目中有两个jar库(app1和app2).bean"BeanName"在app1中定义,并在app2中扩展,并且bean使用相同的名称重新定义.

在app1中:

package com.foo.app1.pkg1;

@Component("BeanName")
public class Class1 { ... }
Run Code Online (Sandbox Code Playgroud)

在app2中:

package com.foo.app2.pkg2;

@Component("BeanName")
public class Class2 extends Class1 { ... }
Run Code Online (Sandbox Code Playgroud)

ConflictingBeanDefinitionException由于相同的组件bean名称,这会导致加载applicationContext时发生异常.

要解决这个问题,请在Spring配置文件applicationContext.xml中:

<context:component-scan base-package="com.foo.app2.pkg2"/>
<context:component-scan base-package="com.foo.app1.pkg1">
    <context:exclude-filter type="assignable" expression="com.foo.app1.pkg1.Class1"/>
</context:component-scan>
Run Code Online (Sandbox Code Playgroud)

因此,排除Class1以自动进行组件扫描并将其分配给bean,从而避免名称冲突.


Ian*_*and 26

我使用@RestController与Spring 4.x有类似的问题.两个不同的包有一个同名的类......

package com.x.catalog

@RestController
public class TextureController {
...

package com.x.cms
@RestController
public class TextureController {
...
Run Code Online (Sandbox Code Playgroud)

修复很简单......

package com.x.catalog

@RestController("CatalogTextureController")
public class TextureController {
...

package com.x.cms
@RestController("CMSTextureController")
public class TextureController {
...
Run Code Online (Sandbox Code Playgroud)

问题似乎是注释被自动装配并默认采用类名.在@RestController注释中为其提供显式名称允许您保留类名.

  • 也为我提供了与@Configuration相冲突的类 (2认同)
  • 您无需在注释中添加唯一的 bean 名称,只需将“FullyQualifiedAnnotationBeanNameGenerator”设置为应用程序的默认 bean 名称生成器即可。这样,您的所有 bean 将具有完全限定的名称(包 + 类名),而不仅仅是裸露的类名。 (2认同)

Vic*_*gwa 15

我遇到过同样的问题。我通过以下步骤解决了这个问题(编辑:IntelliJ):

  1. 查看 -> 工具窗口 -> Maven 项目。在子窗口中打开您的项目。
  2. 单击项目旁边的箭头。
  3. 单击生命周期。
  4. 单击清洁。


Roc*_*Lee 12

我有一个类似的问题,这是因为我的一个bean最近被移动到另一个目录.我需要通过删除build/classes/java目录来进行"构建清理",问题就消失了.(错误消息有两个不同的文件路径相互冲突,虽然我知道一个实际上不应该存在.)

  • 对于 gradle 项目尤其如此,其中“Build”&gt;&gt;“Rebuild Project”并没有像 Visual Studio 中那样真正清理和构建。我必须简单地从 leftt 的项目层次结构中删除“build”文件夹,然后从 intelliJ 菜单中执行“Build”&gt;&gt;“Rebuild Project” (2认同)

Sne*_*sne 5

有时,如果您四处移动您的班级,并且它引用的是旧班级,即使它们不存在,也会出现问题。

在这种情况下,只需执行以下操作:

mvn eclipse:clean

mvn eclipse:eclipse
Run Code Online (Sandbox Code Playgroud)

这对我来说很好。