JAXB / XJC навигация Родитель-Ребенок-Родитель
Я хотел бы иметь двунаправленные методы навигации в классах между дочерним объектом и родительским объектом. 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 и от B до A (через b.Гета ())!! Это очень простой особенность, но я не нахожу простой способ достичь этого ...
есть идеи ??
спасибо заранее
4 ответов
вы можете создать метод 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, что все классы моделей должны расширить ваш базовый класс, создав глобальную конфигурацию привязки 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>
попробуйте это...