現在、次の 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 を介して適切な形式で出力されます。