繁体   English   中英

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

[英]Annotation-specified bean name conflicts with existing, non-compatible bean definition

我正在使用 Spring 2.5.4 并正在创建一个部署到 Weblogic 上的 Java 应用程序。

我在外部库中有一个类(它包含在我的应用程序生成的 WAR 文件的 WEB-INF/classes 目录中),我想在我的代码中使用它。 我在我的代码中为类的对象创建了一个实例变量,并添加了@Autowired 注释和一个getter 和setter。 在我的应用程序上下文文件中,我声明了一个库类类型的 bean 并添加了以下内容:

<context:annotation-config />
<context:component-scan base-package="com.mycompany" />

...为了注册将扫描类并处理注释的 AutowiredAnnotationBeanPostProcessor。

当我尝试部署应用程序时,出现以下错误:

java.lang.IllegalStateException: Annotation-specified bean name 'myBean' for bean
class [com.mycompany.package.ClassName] conflicts with existing, non-compatible
bean definition of same name and class [com.mycompany.otherPackage.ClassName]

我认为这是因为库中有一个类与我的应用程序代码中的类同名(两个类的包名称均以“com.mycompany”开头)。 注意。 这不是我添加的课程,而是一个不同的课程。 有什么方法可以在不更改应用程序中的类名称的情况下绕过这个问题吗?

感谢您的帮助。

老问题,但抛出了我 2c 类似问题的糟糕经历。 如果您有 2 个同名的类,但在不同的包中,是否曾有过失败的 Spring 上下文引用您的其他类的时间? 如果是这样,我建议清理 AS 缓存文件(通常是提取 WAR 的地方),清理/重建你的 WAR 并再次部署。 还建议重新启动应用程序服务器。 我发现应用程序服务器和类似的 Web 容器(Weblogic、WAS、Jboss、Tomcat)往往会留下旧的类,并且在部署应用程序时,这些陈旧的 .class 文件会通过一些旧的引用加载到 JVM 中,这在大多数情况下都是混乱的启动 Spring 上下文加载器。

典型的情况是当您将一个类从一个包重命名/移动到另一个包时,或者甚至保持包名称相同但将其移动到另一个模块(jar)。 在这种情况下,AS 工作目录中的缓存(遗留)文件会引起很大的麻烦。 清除 AS 中的工作目录应该可以彻底解决问题。

您应该使用@qualifier 来避免这种冲突,请参阅第3.9.3节。

我通过完全删除自动装配并通过应用程序上下文和 getBean() 方法显式创建对它的引用来访问 bean 来解决这个问题。

这更适合作为对@Pavel Lechev 的回答的评论,但我还没有足够的代表发表评论。

对于其他人的发现,这就是我为解决这个问题所做的工作。 我正在使用 Wildfly 9.0.2.Final 和 IntelliJ IDEA 2016.1.3 Build #IU-145.1617。 这些步骤大概也适用于 JBoss。

  1. 停止 Wildfly 服务器。
  2. 导航到 $WILDFLY_HOME/standalone/。 删除以下三个文件夹:lib/、log/ 和 temp/。
  3. 在 IntelliJ 中,Build > Build Artifacts > All Artifacts > Clean(或只是您正在部署的工件)。
  4. 在 IntelliJ 中,构建 > 重建项目
  5. 重新启动 Wildfly 并重新部署您的工件。

这些步骤解决了我在重构几个控制器上游的包名称后在 Spring 上下文中检测到重复的 bean 名称的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM