76

Spring Bean の定義に問題があります。main() メソッドによってロードされているコンテキスト xml ファイルがいくつかありますが、どちらもほぼタグのみを含んでいます。メイン メソッドが起動すると、Spring から次のエラーが発生します。

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'converterDAO' for bean class [my.package.InMemoryConverterDaoImpl] conflicts with existing, non-compatible bean definition of same name and class [my.other.package.StaticConverterDAOImpl]

両方の DAO クラスには、次のように注釈が付けられます。

@Repository("converterDAO")
public class StaticConverterDAOImpl implements ConverterDAO {
...
}

インメモリ dao には @Repository("converterDAO") アノテーションもあります。dao は、次のように他のクラスで参照されます。

...
private @Autowired @Qualifier("converterDAO") ConverterDAO converterDAO;
...

私は、ある DAO が他の DAO の定義をオーバーライドすることを望んでいます。これは、そもそも DI フレームワークを使用する主な理由の 1 つであることを常に理解していました。私は何年もxml定義でこれを行ってきましたが、問題はありませんでした。しかし、コンポーネント スキャンと注釈付き Bean 定義ではそうではありませんか? また、Spring が「互換性がない」と言うとき、Spring は何を意味するのでしょうか? これらは同じインターフェイスを実装し、そのインターフェイス タイプのフィールドに自動配線されます。なぜ彼らは互換性がないのですか?

コンポーネントをスキャンして注釈を付けた Bean が別の Bean をオーバーライドする方法を教えてもらえますか?

-マイク

4

15 に答える 15

45

@RestController を使用して、Spring 4.x で同様の問題が発生しました。2 つの異なるパッケージに同じ名前のクラスがありました...

package com.x.catalog

@RestController
public class TextureController {
...

package com.x.cms
@RestController
public class TextureController {
...

修正は簡単でした...

package com.x.catalog

@RestController("CatalogTextureController")
public class TextureController {
...

package com.x.cms
@RestController("CMSTextureController")
public class TextureController {
...

問題は、注釈が自動配線され、デフォルトでクラス名を取得することです。@RestController アノテーションで明示的な名前を付けると、クラス名を保持できます。

于 2016-04-24T03:11:12.233 に答える
39

XML ファイルには一連の宣言があり、以前の定義を新しい定義でオーバーライドできます。注釈を使用する場合、beforeまたはafterの概念はありません。すべての豆は同じレベルです。同じ名前の 2 つの Bean を定義しましたが、Spring はどちらを選択すべきかわかりません。

それらに別の名前を付け ( staticConverterDAOinMemoryConverterDAOなど)、Spring XML ファイルにエイリアスを作成し ( theConverterDAOなど)、コンバーターを注入するときにこのエイリアスを使用します。

@Autowired @Qualifier("theConverterDAO")
于 2012-12-10T20:59:40.640 に答える
31

私も同様の問題を抱えていました。それは、私の Bean の 1 つが最近別のディレクトリに移動されたためです。build/classes/javaディレクトリを削除して「クリーンビルド」を行う必要があり、問題は解決しました。(エラー メッセージには、互いに競合する 2 つの異なるファイル パスが含まれていましたが、実際には 1 つが存在しないことはわかっていました。)

于 2018-06-12T19:32:00.127 に答える
12

クラスを移動した場合、存在しない場合でも、古いクラスを参照している場合に問題が発生することがあります。

この場合、これを行うだけです:

mvn eclipse:clean

mvn eclipse:eclipse

これは私にとってはうまくいきました。

于 2019-05-03T11:27:57.040 に答える
1

他の回答で問題が解決されず、設定を直接的または間接的に (git pull / merge / rebase を介して) 変更した後に問題が発生し始め、プロジェクトが Maven プロジェクトである場合:

mvn clean

これで問題が解決することを願っています。または誰か

于 2020-04-02T13:25:35.650 に答える