13

我想在子对象和父对象之间的类中有双向导航方法。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>

解组后,我希望能够将 A 导航到 Bs 并从 B 导航到 A(通过 b.getA())!这是一个非常基本的功能,但我没有找到一种简单的方法来实现它......

任何想法 ??

提前致谢

4

4 回答 4

15

您可以创建一个 void afterUnmarshal(Unmarshaller, Object parent)被调用的方法......好吧,在解组并根据需要设置对象树之后。

于 2011-06-14T11:52:08.097 回答
7

注意:我是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() {
    ...
}

了解更多信息

于 2011-06-14T12:18:50.137 回答
5

如果您使用xjc从 xsd 生成域模型类,除了musiKk答案。要在所有模型类中添加对父类的引用,您应该:

  1. 创建扩展的基类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;
        }
    }
    
  2. 告诉 xjc 所有模型类都应该通过创建全局 xjc 绑定配置来扩展您的 BaseClass

    <jaxb:globalBindings>
        <xjc:superClass name="com.acme.BaseClass" />
    </jaxb:globalBindings>
    
于 2015-05-28T06:52:33.887 回答
0
<?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>

尝试这个...

于 2011-06-14T11:59:46.700 回答