3

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);
  }
}
4

0 に答える 0