4

私は Spring 2.5.4 を使用しており、Weblogic にデプロイする Java アプリケーションを作成しています。

コードで使用したい外部ライブラリ (アプリケーションの結果の WAR ファイルの WEB-INF/classes ディレクトリに含まれる) にクラスがあります。コードでクラスのオブジェクトのインスタンス変数を作成し、@Autowired アノテーションとゲッターとセッターを追加しました。アプリケーション コンテキスト ファイルで、ライブラリ クラスのタイプの 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

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

オートワイヤリングを完全に削除し、アプリケーション コンテキストと getBean() メソッドを介して明示的に参照を作成して Bean にアクセスすることで問題を修正しました。

于 2012-07-31T22:02:30.413 に答える
0

この種の競合を避けるために @qualifier を使用する必要があります。セクション3.9.3を参照してください。

于 2012-07-31T04:52:48.610 に答える