xjc:覆盖xs:simpleType定义

时间:2014-12-01 23:38:46

标签: java jaxb xsd xjc

我正在使用xjc将一组XSD编译为Java类。我希望能够覆盖给定简单类型的数据类型定义。 XSD片段是:

<xs:simpleType name="CPT-DateTime">
    <xs:annotation>
        <xs:appinfo>Can be specified as a integer number or as xs:dateTime</xs:appinfo>
    </xs:annotation>
    <xs:union memberTypes="xs:unsignedLong xs:dateTime"/>
</xs:simpleType>

结果(毫不奇怪)在CPT-DateTime类型的元素中生成的Java类中定义为String,例如

public class CcReportTrainInitialization {
...
    @XmlElement(required = true)
    protected String time;
...
    public String getTime() {
        return time;
    }

    public void setTime(String value) {
        this.time = value;
    }
...

我希望time(在此示例中)的数据类型是特定于日期时间的类型,例如XMLGregorianCalendar或类似的东西:

public class CcReportTrainInitialization {
...
    @XmlElement(required = true)
    protected XMLGregorianCalendar time;
...
    public XMLGregorianCalendar getTime() {
        return time;
    }

    public void setTime(XMLGregorianCalendar value) {
        this.time = value;
    }
...

这可能吗?

我一直在尝试使用绑定文件,但我不确定它是否可行。建议?

2 个答案:

答案 0 :(得分:3)

一旦我找到正确的咒语,这实际上非常容易;这是绑定文件:

<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings jxb:version="2.1" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <jxb:bindings node="/xs:schema" schemaLocation="../TCIP_4_0_0_Final.xsd">
    <jxb:bindings node="//xs:simpleType[@name='CPT-DateTime']">
      <jxb:class ref="javax.xml.datatype.XMLGregorianCalendar"/>
    </jxb:bindings>
  </jxb:bindings>
</jxb:bindings>

答案 1 :(得分:1)

进一步的选择是:

我实际上认为jaxb:class/@ref自定义不适合简单类型,因为这使它成为&#34;类&#34;类型。这对于内部XJC模型很重要,某些XJC插件可能会错误地处理您的类型。

我认为你应该在这里使用jaxb:javaType。尝试:

<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings jxb:version="2.1" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="urn:your-target-namespace">
  <jxb:bindings node="/xs:schema" schemaLocation="../TCIP_4_0_0_Final.xsd">
    <jxb:globalBindings>
      <jxb:javaType name="javax.xml.datatype.XMLGregorianCalendar" xmlType="tns:CPT-DateTime"/>
    </jxb:globalBindings>
  </jxb:bindings>
</jxb:bindings>