I want to change "javax.xml.datatype.XMLGregorianCalendar" to "java.util.Date" when unmarshalling from xml to Java class of JAXB.
But I don't put any annotations of @XmlJavaTypeAdapter in Java classes.
So, I'm going to try to use an annotation of @XmlJavaTypeAdapters, but I don't know how to use it...
Please show me examples for using it.
A @XmlJavaTypeAdapter annotation on a class overrides the @XmlJavaTypeAdapter annotation specified at the package level for that class. This annotation can be used with the following other annotations: XmlElement , XmlAttribute , XmlElementRef , XmlElementRefs , XmlAnyElement .
A JavaBean property, when annotated with @XmlElement annotation is mapped to a local element in the XML Schema complex type to which the containing class is mapped. Example 2: Map a field to a nillable element. Example 3: Map a field to a nillable, required element.
@XmlRootElement annotation can be used to map a class or enum type to XML type. When a top level class or an enum type is annotated with the @XmlRootElement annotation, then its value is represented as XML element in an XML document.
As an interesting aside, you don't actually need to adapt XMLGregorianCalendar to Date, since JAXB supports java.util.Date natively -- like this:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Example {
@XmlSchemaType(name = "date")
public Date publishingDate;
}
If you need it, @XmlJavaTypeAdapter can work like this, assuming your custom class:
public class SillyDate {
public SillyDate(int year, int month, int day) {
super();
this.year = year;
this.month = month;
this.day = day;
}
public String toString() {
return "SillyDate [year=" + year + ", month=" + month + ", day=" + day + "]";
}
public int year;
public int month;
public int day;
}
You need a class which JAXB can understand, and then write an adapter between that class and the custom class, like this:
public class SillyDateAdapter extends XmlAdapter<XMLGregorianCalendar, SillyDate> {
public SillyDate unmarshal(XMLGregorianCalendar val) throws Exception {
return new SillyDate(val.getYear(), val.getMonth(), val.getDay());
}
public XMLGregorianCalendar marshal(SillyDate val) throws Exception {
return DatatypeFactory.newInstance().newXMLGregorianCalendarDate(val.year, val.month, val.day, 0);
}
}
Now you can use that in your own classes, like this:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Example2 {
@XmlSchemaType(name = "date")
@XmlJavaTypeAdapter(type=XMLGregorianCalendar.class,value =SillyDateAdapter.class)
public SillyDate publishingDate;
}
There are plenty of good examples of using the @XmlJavaTypeAdapter available on the net, like this one and this one, and several others. Happy adapting!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With