Разрешение ссылок JaxB

Для следующего примера ввода XML:


  
    
    
  
  



   
     
   
   
     
     
   

Я пытаюсь убедиться, что PersonList в списке участников указывает на людей, прочитанных из группы1. (см. фрагменты кода ниже для используемых аннотаций JaxB). Это всего лишь пример более общего подхода, который я ищу. Мне нужно быть в состоянии следовать за id = "" и ref = "" атрибуты таким образом, что элементы списка правильно распакованы как ссылки.

Используя UnmarshalListener и Unmarshalling дважды, я обхожу проблему ссылок из атрибута ref на атрибут id. На первом этапе поисковая карта заполняется из атрибутов id. На втором этапе ссылки ищутся. К сожалению, это решение создасткопии вместо ссылок. Я мог бы использовать родительский объект, чтобы исправить это, но я ищу более общее решение. Как можно было бы добиться правильного разыменования с помощью атрибутов ref / id, как показано?}

/**
 * intercept the unmarshalling
 */
public static class ModelElementMarshallerListener extends javax.xml.bind.Unmarshaller.Listener {

 public Map lookup=new HashMap();

 @Override
 public void afterUnmarshal(java.lang.Object target, java.lang.Object parent) {
  if (target instanceof Person) {
    person=(Person) target;
    if (person.getId()!=null) {
       lookup.put(person.getId(), person);
    }
    if (person.getRef()!=null) {
      if (lookup.containsKey(person.getRef())) {
        Person personRef=lookup.get(person.getRef());
        person.copyFrom(personRef);
        person.setRef(null);
      }
    }
   }
 }

@XmlRootElement(name="Participants")
public class Participants  {
  private List workers;

 /**
   * getter for List workers
   * @return workers
   */
  @XmlElementWrapper(name="workers")
  @XmlElement(name="Worker", type=Worker.class)
  public List getWorkers() { 
    return workers; 
  }

...

}

@XmlRootElement(name="Group")
public class Group {

  private List workers;

 /**
   * getter for List workers
   * @return workers
   */
  @XmlElementWrapper(name="workers")
  @XmlElement(name="Worker", type=Worker.class)
  public List getWorkers() { 
    return workers; 
  }
 ...

}
@XmlRootElement(name="Trainer")
public class Trainer extends Person {}


@XmlRootElement(name="Worker")
public class Worker extends Person {}

@XmlRootElement(name="Person")
public class Person {
 private String name;

 /**
   * getter for xsd:string/String name
   * @return name
   */
  @XmlAttribute(name="name")  
  public String getName() {
    return name;
  }

  public void setName(String name) {
     this.name=name;
  }
  private String ref;

 /**
   * getter for xsd:string/String id
   * @return id
   */
  @XmlAttribute(name="ref")  
  public String getRef() {
    return ref;
  }

  public void setRef(String ref) {
    this.ref=ref;
  }

  private String id;
 /**
   * getter for xsd:string/String id
   * @return id
   */
  @XmlAttribute(name="id")  
  @XmlID
  public String getId() { 
    this.id;
  }

  /**
   * setter for xsd:string/String id
   * @param pid - new value for id
   */
  public void setId(String pid) { 
    this.id=pid; 
  }
}

Ответы на вопрос(1)

Ваш ответ на вопрос