Java 如何使用JAXB管理XMLGregorianCalendar?

Java 如何使用JAXB管理XMLGregorianCalendar?,java,xml,jaxb,Java,Xml,Jaxb,我尝试编写XMLGregorianCalender的XML版本,使用GN JAXB创建XMLWeb服务请求。但它不会打印出来 private static XMLGregorianCalendar getXmlDate() throws DatatypeConfigurationException { return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyy

我尝试编写XMLGregorianCalender的XML版本,使用GN JAXB创建XMLWeb服务请求。但它不会打印出来

    private static XMLGregorianCalendar getXmlDate() throws DatatypeConfigurationException {
        return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
    }
同班别的

   try {
        applicationHeader.setApplicationDate(getXmlDate());
    } catch (DatatypeConfigurationException e1) {
        e1.printStackTrace();
    }
因此它调用ApplicationHeader类中生成的代码

    @XmlElement(name = "ApplicationDate", required = true)
    protected XMLGregorianCalendar applicationDate;

    public XMLGregorianCalendar getApplicationDate() {
        return applicationDate;
    }

    public void setApplicationDate(XMLGregorianCalendar value) {
        this.applicationDate = value;
    }
    ...
所以我希望得到像这样的东西

    <ApplicationDate>2009-03-13</ApplicationDate>
2009-03-13
但是我有

    <ApplicationDate></ApplicationDate>


我做错了什么

显然,JAXB无法处理XMLGregorianCalender类型。因此,我通过使用JAXBXmlAdapter解决了这个问题,它本质上允许我们映射任何类型的类。在哪里

BoundType-类型JAXB不知道如何处理。在本例中,是一个XMLGregorianCalendar

ValueType——JAXB实际上知道如何处理这种类型。在本例中是一个类型字符串

因此,在生成XML请求时,可以扩展XMLAdapter,将BoundType转换为ValueType。因此,我们本质上是在ValueType中创建类型的内存表示

代码如下所示

public class DateAdapter extends XmlAdapter<String, XMLGregorianCalendar>  {

    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    // Unmarshal by converting the value type to a bound type.
    @Override
    public XMLGregorianCalendar unmarshal(String v) throws Exception {
        return DatatypeFactory.newInstance().newXMLGregorianCalendar(v);
    }

    // Marshal by converting the bound type to a value type.
    @Override
    public String marshal(XMLGregorianCalendar v) throws Exception {
        synchronized (dateFormat) {
            //return dateFormat.format(v);
            return specialFormatForXmlGregorianCalander(v);
        }
    }

    // Because you cannot format an XMLGregorianCalender typyou need to generate a GregorianCalender from it first  
    private String specialFormatForXmlGregorianCalander(XMLGregorianCalendar calander){
        // Convert from XMLGregorianCalander to GregorianCalander
        GregorianCalendar gCalender = calander.toGregorianCalendar();

        // Get the date
        java.util.Date date = gCalender.getTime();

        //define the type of calendar to be GegorianCalander
        dateFormat.setCalendar(gCalender);

        // Return the string version
        return dateFormat.format(date);
    }
}
在重新运行我的代码时,我得到了

    <app1:ApplicationDate>2017-08-15</app1:ApplicationDate>
2017-08-15
试试这个JAXB.marshal(obj,System.out);它为我打印了XMLGregorianCalendar
    <app1:ApplicationDate>2017-08-15</app1:ApplicationDate>