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注释中为其提供显式名称允许您保留类名.
Vic*_*gwa 15
我遇到过同样的问题。我通过以下步骤解决了这个问题(编辑:IntelliJ):
Roc*_*Lee 12
我有一个类似的问题,这是因为我的一个bean最近被移动到另一个目录.我需要通过删除build/classes/java目录来进行"构建清理",问题就消失了.(错误消息有两个不同的文件路径相互冲突,虽然我知道一个实际上不应该存在.)
有时,如果您四处移动您的班级,并且它引用的是旧班级,即使它们不存在,也会出现问题。
在这种情况下,只需执行以下操作:
mvn eclipse:clean
mvn eclipse:eclipse
Run Code Online (Sandbox Code Playgroud)
这对我来说很好。
| 归档时间: |
|
| 查看次数: |
107466 次 |
| 最近记录: |