Разрешение ссылок 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;
}
}