XmlAdapter
このブログ投稿で提案されているように、不変オブジェクトに使用しています: http://blog.bdoughan.com/2010/12/jaxb-and-immutable-objects.html。これは正常に機能しますが、アダプター内の他の不変オブジェクトへの参照では機能しません。これをJAXBで処理する方法はありますか?
以下は、個人を参照する会社の xml タグの後に個人の xml タグがある場合に機能しない例です。
不変オブジェクト:
@XmlJavaTypeAdapter(PersonAdapter.class)
public class Person {
private final String id;
private final String name;
public Person(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public String getName() {
return name;
}
}
@XmlJavaTypeAdapter(CompanyAdapter.class)
public class Company {
private final String name;
private final Person principal;
public Company(String name, Person principal) {
this.name = name;
this.principal = principal;
}
public String getName() {
return name;
}
public Person getPrincipal() {
return principal;
}
}
個人アダプタ:
public class PersonAdapter extends XmlAdapter<AdaptedPerson, Person> {
public static class AdaptedPerson {
@XmlID
@XmlAttribute
String id;
@XmlAttribute
String name;
}
@Override
public AdaptedPerson marshal(Person v) throws Exception {
AdaptedPerson a = new AdaptedPerson();
a.id = v.getId();
a.name = v.getName();
return a;
}
@Override
public Person unmarshal(AdaptedPerson v) throws Exception {
return new Person(v.id, v.name);
}
}
会社アダプター:
public class CompanyAdapter extends XmlAdapter<AdaptedCompany, Company> {
public static class AdaptedCompany {
@XmlAttribute
String name;
@XmlIDREF
@XmlAttribute
Person principal;
}
@Override
public AdaptedCompany marshal(Company v) throws Exception {
AdaptedCompany a = new AdaptedCompany();
a.name = v.getName();
a.principal = v.getPrincipal();
return a;
}
@Override
public Company unmarshal(AdaptedCompany v) throws Exception {
return new Company(v.name, v.principal);
}
}