4

大きな XML ファイルと、この XML を読み取るために必要ないくつかの POJO クラスがあります。1つのPOJOでテストファイルを読み込もうとすると、これを使用します:

    JAXBContext jaxbContext = JAXBContext.newInstance(Test.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Test ts = (Test)jaxbUnmarshaller.unmarshal(file);
System.out.println(ts.getName());

しかし、POJO が 30 個ある場合はどうすればよいでしょうか。この 4 行を 30 回作成しますか? アドバイスをください。

アップデート

この例http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.htmlから、 私が使用するいくつかのPOGOを使用する方法

JAXBContext.newInstance("message:customer:product:order");

この例では、著者は 3 つのクレスを持っていますが、そのうちの 2 つだけが@XmlRootElement注釈を付けています。なんで?

4

3 に答える 3

6

持っている 30 個すべての POJO で JAXBContext を作成できます。また、それらの名前をパッケージの jaxb.in​​dex インデックス ファイルに保存し、 JAXBContext.newInstance("your.package") を作成することもできます。

javadocの jaxb.in​​dex に関する詳細を次に示します。

コンテキスト パスにリストする代わりに、プログラマがアノテーションを付けた JAXB マップ クラスを jaxb.in​​dex リソース ファイルにリストすることもできます。形式は以下で説明します。Java パッケージには、スキーマ派生クラスとユーザー アノテーション付き JAXB クラスの両方を含めることができることに注意してください。さらに、Java パッケージには、処理が必要な JAXB パッケージ アノテーションが含まれている場合があります。(JLS 第 3 版、セクション 7.4.1.「パッケージの注釈」を参照してください)。

クラスには @XmlRootElement または @XmlType アノテーションを付ける必要があります。

また、 scannotationフレームワークを使用して @XmlRootElement として注釈が付けられたすべてのクラスを見つけ、持っているすべての JAXB POJO で JAXBContext を作成することもできます。

質問がある場合は、コメントしてください。回答を更新します。それが役に立てば幸い。

于 2012-08-20T10:18:56.557 に答える
1

以下が役立つはずです。

注釈

JAXBモデルクラスはアノテーションを必要としません。を作成するときにクラスが自動的に処理される必要があることを示すアノテーションはありませんJAXBContext

Aの作成JAXBContext

を作成する主な方法は2つありますJAXBContext

1-クラスについて

ドメインクラスの配列を渡します。次に、これらのクラスのマッピングが作成されます。参照用にマッピングも作成されます(以下のクラスの概要を参照してください)。

2-コンテキストパス上

あなたが引用した私の記事(http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.html)はコンテキストパスを使用しています。コンテキストパスは、コロンで区切られたパッケージ名で構成されます。各パッケージには、jaxb.indexファイルまたはObjectFactoryクラスのいずれかが含まれている必要があります。このjaxb.indexファイルは、作成するクラス名のキャリッジリターンで区切られたリストですJAXBContext。クラスの配列にを作成する場合と同様にJAXBContext、参照クラスも処理されます。

どのクラスが作成されているか

以下は、を作成するときにどのセカンダリクラスが処理されるかに関係する重要な概念の一部ですJAXBContext

1-参照クラス

クラスでaJAXBContextが作成された場合、はによって参照されるため、も処理されます。FooBarFoo

@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

    private List<Bar> bar;

}

2-スーパークラス

クラスが処理されると、そのスーパークラスも処理されます。@XmlTransientクラスにアノテーションを付けて、クラスが処理されないようにすること ができます( http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.htmlを参照)。

public class Foo extends Bar {
}

3-サブクラス

クラスが処理される場合、そのサブクラスは自動的に処理されません。クラスにアノテーションを付け@XmlSeeAlsoて、処理するサブクラスを指定できます。

@XmlSeeAlso({Bar.class})
public class Foo {
}

4-JAXBアノテーションから参照されるクラス

クラスが処理されると、そのクラス内のJAXBアノテーションで指定されたクラスも処理されます

public class Foo {
    @XmlElements({
         @XmlElement(name="a", type=A.class),
         @XmlElement(name="b", type=B.class)
    })
    private Object bar;
}
于 2012-08-20T18:24:48.443 に答える
1

理想的には、JAXBContext を 1 回だけ作成し、再利用のためにキャッシュします。今

しかし、POJO が 30 個ある場合はどうすればよいでしょうか。この 4 行を 30 回作成しますか?

30 個の POJO がすべて同じパッケージ (com.abc など) にある場合は、コンテキストを次のように作成します。JAXBContext.newInstance("com.abc")

この例では、autor には 3 つのクレスがありますが、そのうちの 2 つだけに @XmlRootElement アノテーションが付けられています。なんで?

XSD スキーマのグローバル要素宣言に対応する POJO のみに@XmlRootElementアノテーションがあります。これは、グローバル要素宣言がインスタンス ドキュメントの潜在的なルート要素であるためです。

より具体的な回答を提供できるように、XML スキーマと XML インスタンス ドキュメントのサンプルを投稿していただければ幸いです。

于 2012-08-20T13:52:50.770 に答える