web-dev-qa-db-ja.com

Springで同じタイプの複数のBeanが必要

重複としてマークする前のリクエスト。私はフォーラムを通過しましたが、問題の解決策がどこにも見つかりませんでした。

私はSpring 3.2を使用してコードを書いていますが、すべてが純粋に注釈ベースです。コードは、異なるXSDファイルから派生したXMLファイルを受け取ります。

したがって、5つの異なるXSD(A1、A2、A3、A4、A5)があり、私のコードは任意のタイプのXMLを受け取り、到着時にXMLのタイプを識別するロジックを持っています。

現在、Spring OXMを使用してこれらのマーシャリングを解除しようとしています。しかし、複数のXSDが関係しているため、実際に1つのアンマーシャラーを使用することはできません。そのため、約5つ必要です。

Configurationクラスに、以下のような5つのBeanを追加しました。

@Bean(name="A1Unmarshaller")
public Jaxb2Marshaller A1Unmarshaller(){
    Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
    unMarshaller.setContextPath("package name for the classes generate by XSD A1");
}

@Bean(name="A2Unmarshaller")
public Jaxb2Marshaller A1Unmarshaller(){
    Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
    unMarshaller.setContextPath("package name for the classes generate by XSD A2");
}

@Bean(name="A3Unmarshaller")
public Jaxb2Marshaller A3Unmarshaller(){
    Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
    unMarshaller.setContextPath("package name for the classes generate by XSD A3");
}

@Bean(name="A4Unmarshaller")
public Jaxb2Marshaller A4Unmarshaller(){
    Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
    unMarshaller.setContextPath("package name for the classes generate by XSD A4");
}

@Bean(name="A5Unmarshaller")
public Jaxb2Marshaller A5Unmarshaller(){
    Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
    unMarshaller.setContextPath("package name for the classes generate by XSD A5");
}

現在、5つの異なるクラスC1、C2、C3、C4、C5があり、1つのクラスに1つのアンマーシャラーBeanを注入しようとしています。つまり、A1UnmarshallerC1などに自動接続されます。

Springコンテキストが構築されると、タイプJaxb2Marshallerの1つのBeanを予期し、5つのBeanを取得したというエラーがスローされます。

XML構成を使用して問題なく動作したため、何か不足しているのかどうかわかりません。助けてください。

[〜#〜] edit [〜#〜]クラスC1のいずれかのコードは以下のとおりです。

@Component
public class C1{

@Autowired
private Jaxb2Marshaller A1Unmarshaller;
    A1 o = null

public boolean handles(String event, int eventId) {
    if (null != event&& eventId == 5) {
                A1 =  A1Unmarshaller.unMarshal(event);
        return true;
    }
    return false;
}

}

23
dharam

自動配線された変数を修飾して、どの変数を挿入するかを指定する必要があります

@Autowired
@Qualifier("A1Unmarshaller")
private Jaxb2Marshaller A1Unmarshaller;

デフォルトの自動配線は名前ではなくタイプごとに行われるため、同じタイプのBeanが複数ある場合は、@ Qualifierアノテーションを使用する必要があります。

43
Bruce Lowe

Jaxb2Marshallerは、複数の異なるコンテキスト/ xsdで完全に機能します。 setContextPaths メソッドを使用して、複数のコンテキストパスを指定するだけです。

@Bean(name="A1Unmarshaller")
public Jaxb2Marshaller A1Unmarshaller(){
    Jaxb2Marshaller unMarshaller = new Jaxb2Marshaller();
    unMarshaller.setContextPaths(
        "package name for the classes generate by XSD A1",
        "package name for the classes generate by XSD A2",
        "package name for the classes generate by XSD A3",
        "package name for the classes generate by XSD A4",
        "package name for the classes generate by XSD A5" );
    return unMarshaller;
}

そうすれば、マーシャラー/アンマーシャラーが1つだけ必要になります。

リンク集

  1. Jaxb2Marshaller javadoc
  2. setContextPaths javadoc
4
M. Deinum

@Resourceアノテーションを使用したインジェクションは、あなたが探しているものです。使用できます

@AutoWired
@Qualifier("A1Unmarshaller")
private Jaxb2Marshaller A1Unmarshaller;

しかし、それが唯一の方法ではありません。

@Resource("A1Unmrshaller")

仕事もします。後者を使用することをお勧めします! 理由を見る

4
Amanuel Nega