102

私は JAXB を初めて使用し、JAXB 2.1.3 の xjc を使用して XML スキーマから一連のクラスを生成しました。スキーマ内の各要素のクラスを生成するだけでなく、ObjectFactory クラスを作成しました。

要素を直接インスタンス化することを妨げるものは何もないようです。

MyElement element = new MyElement();

一方、チュートリアルは好むようです

MyElement element = new ObjectFactory().createMyElement();

ObjectFactory.java を調べると、次のように表示されます。

public MyElement createMyElement() {
    return new MyElement();
}

それで、取引は何ですか?なぜわざわざ ObjectFactory クラスを維持しなければならないのでしょうか? 変更されたスキーマから再コンパイルすると、それも上書きされると思います。

4

3 に答える 3

71

下位互換性だけが理由ではありません。:-P

要素のコンテンツが取ることができる値に複雑な制約があるスキーマなど、より複雑なスキーマでは、実際のJAXBElementオブジェクトを作成する必要がある場合があります。通常、手動で作成するのは簡単ではないため、create*メソッドが面倒な作業を行います。例 (XHTML 1.1 スキーマから):

@XmlElementDecl(namespace = "http://www.w3.org/1999/xhtml", name = "style", scope = XhtmlHeadType.class)
public JAXBElement<XhtmlStyleType> createXhtmlHeadTypeStyle(XhtmlStyleType value) {
    return new JAXBElement<XhtmlStyleType>(_XhtmlHeadTypeStyle_QNAME, XhtmlStyleType.class, XhtmlHeadType.class, value);
}

これは、<style>タグをタグに取得する方法です<head>

ObjectFactory factory = new ObjectFactory();
XhtmlHtmlType html = factory.createXhtmlHtmlType();
XhtmlHeadType head = factory.createXhtmlHeadType();
html.setHead(head);
XhtmlStyleType style = factory.createXhtmlStyleType();
head.getContent().add(factory.createXhtmlHeadTypeStyle(style));

の最初の 3 つの使用法はObjectFactory不必要と見なすことができますが (一貫性には役立ちます)、4 つ目の使用法によって JAXB がはるかに使いやすくなります。いちいち手で書き出すイメージnew JAXBElement

于 2009-06-05T01:17:19.503 に答える
41

@Chris が指摘したように、スキーマを Java に正確にマップできないため、JAXB が POJO で動作しないことがあります。このような場合、JAXBElement追加の型情報を提供するためにラッパー オブジェクトが必要です。

これが一般的な場所で私が遭遇した2つの具体的な例があります。

  • @XmlRootElementアノテーションを持たないクラスのオブジェクトをマーシャリングしたい場合。デフォルトでは、XJC@XmlRootElementは一部の要素に対してのみ生成し、他の要素に対しては生成しません。これの正確なロジックは少し複雑ですが、 「シンプル バインディング モード」@XmlRootElementを使用して XJC にさらに多くのクラスを生成させることができます。

  • スキーマが置換グループを使用する場合。JAXBElementこれはかなり高度なスキーマの使用法ですが、XJC はラッパーを多用して置換グループを Java に変換します。

そのため、(何らかの理由で) を多用する XJC 生成のオブジェクト モデルでは、これらのインスタンスJAXBElementを構築する方法が必要です。JAXBElement生成さObjectFactoryれたものは、それを行う最も簡単な方法です。それらを自分で構築することはできますが、そうすると扱いにくく、エラーが発生しやすくなります。

于 2009-09-02T12:30:54.213 に答える
9

後方互換性、私は推測します...

http://weblogs.java.net/blog/kohsuke/archive/2005/08/a_story_of_migr.html :

...もう ObjectFactory.createXYZ はありません。これらのファクトリ メソッドの問題は、チェック済みの JAXBException をスローすることでした。これで、新しい XYZ() を実行できるようになり、try/catch ブロックは不要になりました。(わかってる、わかってる...これは「何を考えていたんだ!?」ということの 1 つです)...

于 2009-06-05T00:45:16.527 に答える