1

現在、次の 2 つの POJO クラスがあります。

@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.FIELD)
public class User {
    @XmlElement
    private String firstName;
    @XmlElement
    private String lastName;
    @XmlElement
    private String email;

    /* snipped getters, setters, and constructors. */
}


@XmlRootElement(name = "testobj")
@XmlAccessorType(XmlAccessType.FIELD)
public class TestObj {
    @XmlElement(name="data")
    private String someData;
    @XmlElement
    private User user;

    /* snipped getters, setters, and constructors. */
}

電流出力

<testObj>
    <name>testObj</name>
    <user>
        <firstName>John</firstName>
        <lastName>Doe</lastName>
        <email>john@doe.org</email>
    </user>
</testObj>

望ましい出力

<testObj>
    <data>some data</data>
    <firstName>John</firstName>
    <lastName>Doe</lastName>
    <email>john@doe.org</email>
</testObj>

目的の出力を達成する方法はありますか? ユーザー オブジェクトをネストする理由は、次のような型階層があるためです。

User
  |-> Customer
        |-> SpecialCustomer

DetailedUser
  |-> DetailedCustomer
        |-> DetailedSpecialCustomer

これらの 6 つのタイプは、API 呼び出しの結果として出力されるデータを保持するために特に使用されます。それらには論理がありません。アプリケーションによって内部的に使用される別のより複雑なタイプ セットと、内部アプリ タイプを API 出力タイプに変換するための一連のファクトリがあります。API 出力タイプは、JAXB と Jackson を使用して XML と JSON にシリアライズされます。コードの重複を避けるために、コンポジションを使用して単純な User|Customer|SpecialCustomer を複合型に次のように埋め込みたいと考えています。

@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.FIELD)
public class DetailedUser {
    @Xml[...?]
    private User user;
    @XmlElement
    private String otherProperty;
    @XmlElement
    private String extraStuff;

    /* snipped getters, setters, and constructors. */
}

DetailedUser が JAXB を介して出力されると、次のようになります。

<user>
    <firstName>John</firstName>
    <lastName>Doe</lastName>
    <email>john@doe.org</email>
    <otherProperty>something</otherProperty>
    <extraStuff></extraStuff>
</user>

オブジェクト ツリーは、コンテンツ ネゴシエーションを使用して Spring MVC を介して適切な形式で出力されます。

4

1 に答える 1