4

我正在使用 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”开头)。NB。这不是我添加的课程,而是不同的课程。有什么办法可以在不更改应用程序中类的名称的情况下绕过这个问题?

感谢您的任何帮助。

4

4 回答 4

18

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

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

于 2015-07-30T14:00:41.637 回答
0

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

于 2012-07-31T04:52:48.610 回答
0

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

于 2012-07-31T22:02:30.413 回答
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 > Build Artifacts > All Artifacts > Clean(或只是您正在部署的工件)。
  4. 在 IntelliJ 中,构建 > 重建项目
  5. 重新启动 Wildfly 并重新部署您的工件。

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

于 2016-06-29T15:29:04.273 回答