2017-08-16 55 views
0

我試圖寫出XMLGregorianCalender的XML版本使用JAXB創建XML Web服務請求。但它不會打印出來。如何使用JAXB編寫XMLGregorianCalender?

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> 
我得到了
<ApplicationDate></ApplicationDate> 

我在做什麼錯?

+0

試試這個JAXB.marshal(OBJ下,System.out);它爲我打印XMLGregorianCalendar –

回答

0

顯然JAXB無法處理XMLGregorianCalender類型。所以我通過使用JAXB XmlAdapter解決了這個問題,它基本上允許我們映射任何類型的類。在哪裏...

BoundType - JAXB類型不知道如何處理。在這種情況下是一個XMLGregorianCalender。

ValueType - JAXB實際上知道如何處理的類型。在這種情況下,一個String類型。

因此,當您生成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); 
    } 
} 

所以現在我的JAXB生成的類ApplicatioHeader,我需要爲了告訴JAXB使用名爲DateAdaptor的XMLAdaptor註釋。

@XmlElement(name = "ApplicationDate", required = true) 
    @XmlJavaTypeAdapter(DateAdapter.class) 
    protected XMLGregorianCalendar applicationDate; 

在重新運行我的代碼我

<app1:ApplicationDate>2017-08-15</app1:ApplicationDate>