web-dev-qa-db-ja.com

JAXBのフィールドを除外する

私には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
}

デフォルトでは、クラスAのインスタンスをXMLに変換すると、そのすべてのフィールド(id)と参照されるBクラスフィールド(idfield1field2) このような:

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

what参照クラスBのフィールドをAクラスのXMLに含めることはできますか?例えば。 Aクラスのインスタンスを変換するとき、idクラスからBを取得したいだけです(field1およびfield2フィールド)、したがって、私は取得したい:

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

Bクラスに永続的に注釈を付けたくありません(@XMLTransientまたは@XMLElementBクラス全体をそのまま(idで、field1およびfield2。)
BクラスがAから参照されている場合、これらのフィールドをすべてエクスポートしたくありません。

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

38
Piotr Nowicki

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

他の例については、 JAXBのガイド BaeldungのWebサイトをご覧ください。

21

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

102
AlexR

わかりました、私はいくつかのハッキーなソリューションを思い付きました:

_@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"})またはそのようなものは私の意見ではずっときれいです。

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

13
Piotr Nowicki