JAXB绑定超类型属性

时间:2014-11-06 07:50:29

标签: java jaxb

有:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="A", propOrder={"k", "l"})
public class A {

    @XmlElement(name="kkk")
    protected K k;

    @XmlElement(name="lll")
    protected L l;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="B")
public class B extends A {
}

在xsd中看起来像:

<xsd:complexType name="A">
    <xsd:sequence>
        <xsd:element name="kkk" type="K" minOccurs="0"/>
        <xsd:element name="lll" type="L" minOccurs="0"/>
    </xsd:sequence>
</xsd:complexType>

<xsd:complexType name="B">
    <xsd:complexContent>
        <xsd:extension base="A"/>
    </xsd:complexContent>
</xsd:complexType>

但是当我尝试解析B类型的元素时:

...
  <b>
    <kkk>...</kkk>
    <lll>...</lll>
  </b>
...

我得到的错误如下:

Caused by: org.xml.sax.SAXParseException; lineNumber: 27; columnNumber: 35; cvc-
complex-type.2.1: Element 'b' must have no character or element information item
 [children], because the type's content type is empty.

问题出在哪里?

1 个答案:

答案 0 :(得分:0)

给出的例子是完全正确的。问题是使用了xsd:restriction标记而不是xsd:extension。它们的区别在于restriction不允许基本类型允许的某些元素,属性或值,extension允许显示其他属性和元素。*

所以,在我的情况下,我禁止A类型中的任何B元素,直到我发现我使用了错误的标记。