2012-07-31 119 views
3

我使用的是Spring 2.5.4,並且正在創建一個將部署到Weblogic上的Java應用程序。註解指定的bean名稱與現有的非兼容bean定義衝突

我在我的代碼中使用外部庫(包含在我的應用程序的結果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

我通過應用上下文和getBean()方法通過顯式創建對它的引用來完全去除自動裝配並訪問bean,從而解決了問題。

+7

你應該儘量避免使用getBean()方法。 Spring被用作IOC容器。你在做什麼不是IOC ...非常難看的解決方案 – 2013-04-19 15:53:51

0

您應該使用@qualifier來避免這種衝突,請參閱第3.9.3節。

+0

我嘗試了你的建議,但得到了同樣的錯誤。 我已加入下列到有問題的(本地)類的在我的應用上下文中的bean定義: <豆ID = 「爲myBean」 類= 「myLocalClass」><限定符值= 「myLabel」/> ...和這個類文件: @Qualifier(「myLabel」) – GarlicBread 2012-07-31 05:05:49

+1

你是否使用@Component來註釋bean,如果是,那麼嘗試使用@Component(「myLabel」) – 2012-07-31 05:12:10

13

老問題,但扔我2c類似問題的不良經驗。 如果您有兩個具有相同名稱的類,但是在不同的包中,您是否曾有過其他類由失敗的Spring上下文引用的時間?如果是這樣,我建議清理AS緩存文件(通常是解壓縮WAR的地方),清理/重建WAR並重新部署。重新啓動應用服務器也是推薦的。 我發現應用程序服務器和Web容器(Weblogic,WAS,Jboss,Tomcat)都傾向於留下舊類,並且在部署應用程序時,那些陳舊的.class文件通過一些舊引用加載到JVM中,大多數情況下混淆了Spring上下文加載器。

典型的情況是,當您將一個類從一個包重命名/移動到另一個包時,或者甚至保持包名相同但將其移至另一個模塊(jar)。在這種情況下,AS工作目錄中的緩存(遺留)文件可能會引起很大的麻煩。清除AS中的工作目錄應徹底解決問題。

+5

另外,在部署之前運行'mvn clean'或類似軟件可能會有所幫助。也許過時的類文件在構建端。 – vadipp 2015-09-07 12:18:20

+0

這幫助我解決了Spring Boot和EAP的一個問題。謝謝! – newtonrd 2017-04-03 16:54:57

0

這將更好地適合@Pavel Lechev的回答,但我沒有足夠的代表評論。

對於其他人的發現,這是我做了什麼來解決這個問題。我正在使用Wildfly 9.0.2.Final和IntelliJ IDEA 2016.1.3 Build#IU-145.1617。這些步驟應該也可以與JBoss一起使用。

  1. 停止蜻蜓服務器。
  2. 導航到$ WILDFLY_HOME/standalone /。刪除以下三個文件夾:lib /,log /和temp /。
  3. 在IntelliJ,構建>構建工件>所有工件>清潔(或只是您正在部署的工件)。
  4. 在IntelliJ中,生成>重建項目
  5. 重新啓動Wild and並重新部署您的工件。

這些步驟解決了在重構來自幾個控制器的上游包名稱之後,在Spring上下文中檢測到重複的bean名稱的問題。

相關問題