Я компилирую XSD, используя xjc, который включает в себя следующий тип:
<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>
Полученные классы, которые используют этот тип, скомпилированы с этим элементом, установленным как String, в то время как я предпочел бы им использовать XMLGregorianCalendar.
Есть ли способ, который заставит xjc выбрать тип члена xs: dateTime над String? Я видел, как это сделать для простых типов, но не для союзов.
Я полагаю, что вы написали, действительно, должны работать для произвольных простых типов. Предполагая, что tns
является объявленным префиксом для пространства имен Targen в вашей схеме, попробуйте следующее сопоставление:
<globalBindings>
<javaType name="javax.xml.datatype.XMLGregorianCalendar" xmlType="tns:CPT-DateTime" .../>
</globalBindings>
Однако я не уверен на 100%.
Также проверьте xjc:javaType
.
Решение приходит благодаря окончательной реализации denishaskin:
<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings jxb:version="2.1" xmlns:jxb="{NS1-n}" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc">
<jxb:bindings node="/xs:schema" schemaLocation="../{SCHEMA}.xsd">
<jxb:globalBindings>
<jxb:javaType name="org.joda.time.DateTime" xmlType="xs:dateTime"/>
<jxb:javaType name="org.joda.time.DateTime" xmlType="tns:CPT-DateTime"/>
<jxb:javaType name="org.joda.time.LocalDate" xmlType="tns:CPT-Date"/>
<jxb:javaType name="org.joda.time.LocalTime" xmlType="tns:CPT-Time"/>
</jxb:globalBindings>
</jxb:bindings>
Аналогичный вопрос здесь xjc: переопределить xs: simpleType definition
javaType
не будет работать, потому что XMLGregorianCalendar
является абстрактным. Я направился по пути добавления небольшого адаптера.