I am compiling a set of XSDs to Java classes using xjc
. I would like to be able to override the data type definition for a given simple type. The XSD snippet is:
<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>
which results (not surprisingly) in an element of the CPT-DateTime
type being defined in the resulting Java class as a String
, e.g.
public class CcReportTrainInitialization {
...
@XmlElement(required = true)
protected String time;
...
public String getTime() {
return time;
}
public void setTime(String value) {
this.time = value;
}
...
What I would like is for the datatype of time
(in this example) to be a date-time specific type, e.g. XMLGregorianCalendar
or something like that:
public class CcReportTrainInitialization {
...
@XmlElement(required = true)
protected XMLGregorianCalendar time;
...
public XMLGregorianCalendar getTime() {
return time;
}
public void setTime(XMLGregorianCalendar value) {
this.time = value;
}
...
Is this possible?
I've been experimenting with a binding file but I'm not sure it's even possible to do. Suggestions?
This was actually remarkably easy once I found the right incantation; here's the bindings file:
Further options are:
jaxb:baseType
jaxb:javaType
xjc:javaType
- likejaxb:javaType
but allows specifying the adapter class instead ofunmarshal
/marshal
methods.I would actually argue that
jaxb:class/@ref
customization is not right for the simple type as this makes it a "class" type. This matters for the internal XJC model, some of the XJC plugins may handle your type incorrectly.I think you should use
jaxb:javaType
here. Try: