【问题标题】:JAXB xjc:simple binding does not generate @XmlRootElement for base classJAXB xjc:简单绑定不会为基类生成@XmlRootElement
【发布时间】:2015-09-01 23:15:07
【问题描述】:

我正在使用 JAXB 2.0。我在 XSD 文件中定义了各种元素和类型。这是一个例子:

<xs:element name="Person" type="Person" />
<xs:complexType name="Person">
    <xs:attribute name="name" type="xs:string"/>
</xs:complexType>

<xs:element name="Musician" type="Musician"/>
<xs:complexType name="Musician">
    <xs:complexContent>
        <xs:extension base="Person">
             <xs:attribute name="instrument" type="xs:string"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:element name="People" type="People"/>
<xs:complexType name="People">
    <xs:sequence>
        <xs:element name="person" type="Person" minOccurs="0" maxOccurs="Unbounded/>
    </xs:sequence>
</xs:complexType>

从上面的模式示例中您可以看到,我们有一个人,他有一个名字,还有一个音乐家,他也是一个人(虽然这可能会引起一些争论,但这是另一个论坛的问题)。还有一个 People 元素,它本质上是 Person 类型的集合。

我在绑定文件中有以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
jaxb:version="2.0" 
xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc" 
jaxb:extensionBindingPrefixes="xjc"> 
    <jaxb:globalBindings optionalProperty="wrapper"> 
            <xjc:simple/>
    </jaxb:globalBindings> 

我对这些对象的预期用途是:

  1. Person 可能显示为单独的 Marshalled 元素,也可能是 People 对象的一部分
  2. 如果 Person 是 People 对象的一部分,则 xsi:type 应指示它是普通 Person 还是 Musician。

所以我需要生成的Java 类同时包含@XmlRootElement 注释和@XmlType 注释。 xjc:simple 绑定为 Musician 创建了两个注解,但只为 Person 创建了 @XmlType。所以当我 Marshall 一个 Person 对象时,我得到的只是:

<?xml version="1.0" encoding="UTF-8"?>

而我希望看到的是:

<?xml version="1.0" encoding="UTF-8"?>
<Person name="John Doe"/>

对于 People 对象,我想查看:

<?xml version="1.0" encoding="UTF-8"?>
<People>
    <person name="John Doe" xsi:type="Person"/>
    <person name="Keith Richards" xsi:type="Musician"/>
</People>

我已经阅读了与 xjc 的简单绑定,它适用于继承层次结构中的所有最低级别。但是,基类最终没有 @XmlRootElement 注释。对于我正在处理的用例,必须将基类编组为顶级元素和其他元素的成员。欢迎提出任何建议。

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    https://github.com/highsource/jaxb2-annotate-plugin可以用

    <?xml version="1.0" encoding="UTF-8"?>
    <jaxb:bindings xmlns:annox="http://annox.dev.java.net"
                   xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
                   jaxb:version="2.1"
                   xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
                   jaxb:extensionBindingPrefixes="xjc annox">
    
        <jaxb:bindings node="//xs:complexType[@name='Person']">
            <annox:annotate>
                <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="person"/>
            </annox:annotate>
        </jaxb:bindings>
    </jaxb:bindings>
    

    【讨论】:

      猜你喜欢
      • 2012-09-25
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多