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

时间:2012-07-31 04:38:25

标签: java spring annotations

我正在使用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”开头)。铌。这不是我添加的课程,而是另一课程。有没有办法在不改变应用程序中类的名称的情况下绕过这个问题?

感谢您的帮助。

4 个答案:

答案 0 :(得分:14)

老问题但是我遇到了类似问题的2c经验。 如果你有2个具有相同名称的类,但是在不同的包中有一段时间你的其他类被失败的Spring上下文引用了吗?如果是这样,我建议清理AS缓存文件(通常是提取WAR的位置),清理/重建WAR并再次部署。还建议重新启动应用服务器。 我发现应用程序服务器和Web容器(Weblogic,WAS,Jboss,Tomcat)都倾向于留下旧类,当部署应用程序时,那些陈旧的.class文件通过一些旧的引用加载到JVM中,大多数时候这些引用都是混乱的。 Spring上下文加载器。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这更适合作为对@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&gt;构建工件&gt;所有文物&gt;清理(​​或只是您正在部署的工件)。
  4. 在IntelliJ,Build&gt;重建项目
  5. 重新启动Wildfly并重新部署您的工件。
  6. 这些步骤解决了我在从几个控制器上游重构包名后在Spring上下文中检测到重复bean名称的问题。