我正在使用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”开头)。铌。这不是我添加的课程,而是另一课程。有没有办法在不改变应用程序中类的名称的情况下绕过这个问题?
感谢您的帮助。
答案 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。
这些步骤解决了我在从几个控制器上游重构包名后在Spring上下文中检测到重复bean名称的问题。