Ответ 1
Вы можете создать метод void afterUnmarshal(Unmarshaller, Object parent)
, который будет вызван... ну, после unmarshalling и настройте ваше дерево объектов по мере необходимости.
Я хотел бы иметь двунаправленные методы навигации в классах между дочерним объектом и родительским объектом. IDREF недостаточно в моем случае, потому что я не хочу указывать le id родителя. чтобы быть ясным, из xsd:
<complexType name="A">
<xs:sequence>
<element name="b" type="B" minOccurs="0" maxOccurs="unbounded"></element>
</xs:sequence>
<attribute name="id" type="ID"></attribute>
</complexType>
<complexType name="B">
<attribute name="id" type="ID"></attribute>
</complexType>
Мне бы хотелось, чтобы классы выглядели следующим образом:
class A {
...
public List<B> getB() { ...}
...
}
class B {
...
public A getA() {
...
}
и мой xml должен выглядеть так:
<a id="a1">
<b id="b1"/>
<b id="b2"/>
...
</a>
После unmarshal я хотел бы иметь возможность перемещаться от A до Bs AND от B до A (через b.getA())!! Это очень простая функция, но я не нахожу простой способ добиться этого...
Любая идея?
Заранее спасибо
Вы можете создать метод void afterUnmarshal(Unmarshaller, Object parent)
, который будет вызван... ну, после unmarshalling и настройте ваше дерево объектов по мере необходимости.
Примечание. Я EclipseLink JAXB (MOXy) и член JAXB (JSR-222) экспертная группа.
Eclipse JAXB (MOXy) предлагает расширение @XmlInverseReference
для обработки этого прецедента. В настоящее время он не может быть сгенерирован XJC и должен применяться к модели домена напрямую:
class A {
...
public List<B> getB() { ...}
...
}
class B {
...
@XmlInverseReference(mappedBy="b")
public A getA() {
...
}
Дополнительная информация
В дополнение к musiKk ответьте, если вы используете xjc для создания классов модели домена из xsd. Чтобы добавить ссылку на родительский класс во всех классах моделей, вы должны:
Создайте базовый класс, который расширяет Unmarshaller.Listener
public abstract class BaseClass extends Unmarshaller.Listener {
protected Object parent;
public void afterUnmarshal(Unmarshaller unmarshaller, Object parent) {
this.parent = parent;
}
public Object getParent(){
return parent;
}
}
Сообщите xjc, что все классы классов должны расширять ваш BaseClass, создавая глобальную конфигурацию привязки xjc
<jaxb:globalBindings>
<xjc:superClass name="com.acme.BaseClass" />
</jaxb:globalBindings>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="A">
<xs:sequence>
<xs:element name="b" type="B" minOccurs="0" maxOccurs="unbounded">
</xs:element>
</xs:sequence>
<xs:attribute name="id" type="xs:ID"></xs:attribute>
</xs:complexType>
<xs:complexType name="B">
<xs:sequence>
<xs:element name="a" type="A" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<xs:attribute name="id" type="xs:ID"></xs:attribute>
</xs:schema>
Попробуйте это...