【问题标题】:xjc: override xs:simpleType definitionxjc: 覆盖 xs:simpleType 定义
【发布时间】:2014-12-01 23:38:46
【问题描述】:

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

<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;
    }
...

这可能吗?

我一直在尝试绑定文件,但我不确定它是否可行。有什么建议吗?

【问题讨论】:

    标签: java jaxb xsd xjc


    【解决方案1】:

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

    <?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>
    

    【讨论】:

      【解决方案2】:

      其他选项是:

      我实际上认为jaxb:class/@ref 自定义不适合简单类型,因为这使其成为“类”类型。这对于内部 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>
      

      【讨论】:

      • 我认为这是正确的轨道,尽管在生成的适配器源中使用jxb:javaType 我得到error: XMLGregorianCalendar is abstract; cannot be instantiated,这是有道理的。我正在尝试xjc:javaType,但不清楚我是否需​​要为此编写自己的适配器类,或者是否有一个将/可以使用的现有适配器类。
      • 更准确地说:似乎应该有某种方法可以编写一个绑定文件,该文件可以从tns:CPT-DateTime 映射到XMLGregorianCalendar,而无需编写适配器类...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 2020-04-28
      • 2018-10-18
      相关资源
      最近更新 更多