35

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

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

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

現在、Spring OXM を使用してこれらをアンマーシャリングしようとしています。しかし、複数の XSD が関係しているため、実際には 1 つの Un-marshaller を使用することはできません。ですので、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 A2Unmarshaller(){
    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");
}

現在、C1、C2、C3、C4、および C5 の 5 つの異なるクラスがあり、1 つのアンマーシャラー Bean を 1 つのクラスに注入しようとしています。つまりA1Unmarshaller、autowired などにC1なります。

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

注: XML 構成を使用すると正常に機能したため、何か不足しているかどうかはわかりません。助けてください。

EDITクラス C1 の 1 つのコードは以下のとおりです。

@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;
}

}

4

3 に答える 3

10

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. Jaxb2Marshaller javadoc
  2. setContextPaths javadoc
于 2013-09-10T09:14:40.870 に答える
4

アノテーションを使用した注入@Resourceは、探しているものです。使用できます

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

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

@Resource("A1Unmrshaller")

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

于 2017-04-18T14:46:42.950 に答える