47

私には2つのクラスがあります:

@XmlRootElement
public class A {

    private Long id;
    private B b;

    // setters and getters
}

@XmlRootElement
public class B {

    private Long id;
    private String field1;
    private String field2;

    // setters and getters
}

デフォルトでは、クラスのインスタンスをAXMLに変換すると、そのすべてのフィールド(id)と参照されるBクラスフィールド(、、id)が次のようにfield1なります。field2

<a>
    <id>2</id>
    <b>
        <id>5</id>
        <field1>test1</field1>
        <field2>test3</field2>
    </b>
</a>

参照されるクラスのどのフィールドがクラスBのXMLに含まれるかを変更することは可能Aですか?たとえば、クラスのインスタンスを変換するときは、クラス(noとfields)Aから取得したいだけなので、次のように取得したいと思います。idBfield1field2

<a>
    <id>2</id>
    <b>
        <id>5</id>
    </b>
</a>

クラス全体をそのまま(、、および。を使用して)エクスポートしたい場合があるため、Bクラスに永続的に注釈を付けて(@XMLTransientまたはを使用して)達成し たくありません。クラスはから参照されます。@XMLElementBidfield1field2
BA

これはJAX-Bでも可能ですか?

4

3 に答える 3

106

注釈@XmlTransientを使用してフィールドを無視できます。この注釈をフィールド自体またはそのゲッターに配置します。

于 2012-06-10T12:09:16.190 に答える
32

フィールドで使用できます@XmlTransientまた、デフォルトの JAXB バインディングは、カスタム バインディング宣言を使用して、必要に応じてグローバル スコープまたはケースバイケースでオーバーライドできます。

その他の例については、Baeldung Web サイトのGuide to JAXBを参照してください。

于 2012-06-10T13:19:12.783 に答える
13

わかりました、私はいくつかのハッキーな解決策を思いつきました:

@XmlRootElement
public class A {

    private Long id;
    private B b;

    // setters and getters
}

RESTユースケースのためだけに追加のゲッターを提供したので、次のようになります。

@XMLTransient
public B getB() {
    return b;
}

@XMLElement(name="b")
public Long getBForREST() {
    return b.getId();
}

その結果、次の構造になります。

<a>
    <id>2</id>
    <b>5</b>
</a>

それは私がそれが私のために働くことを目指したのとまったく同じ構造ではありません。

私はこの解決策が好きではありません-@XMLExclude({"field1", "field2"})またはそのようなものは私の意見でははるかにきれいになるでしょう。

それにもかかわらず、今のところ、それは機能します。それは醜いですが、それは動作します。

于 2012-06-10T17:16:16.880 に答える