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.
解决方案
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 {
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!