2011-01-12 39 views
4

將xml解組爲Java類JAXB時,我想將「javax.xml.datatype.XMLGregorianCalendar」更改爲「java.util.Date」。在JAXB中,如何使用@XmlJavaTypeAdapters註解?

但是我沒有在Java類中添加@XmlJavaTypeAdapter的任何註釋。

所以,我將嘗試使用@XmlJavaTypeAdapters的註釋,但我不知道如何使用它...

請告訴我要使用它的例子。

+1

您是使用從模式或手寫JAXB綁定中生成的代碼嗎? – skaffman 2011-01-12 10:27:02

+0

謝謝你的回覆,skaffman。我將它製作成手寫的,並且架構是從JavaBean創建的,沒有使用Ant任務的註釋。 – Take 2011-01-13 00:06:11

回答

8

作爲一個有趣的不談,你實際上並不需要適應的XMLGregorianCalendar到日期,因爲JAXB支持java.util.Date本身 - 是這樣的:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement 
public class Example { 
    @XmlSchemaType(name = "date") 
    public Date publishingDate; 
} 

如果你需要它,@XmlJavaTypeAdapter能這樣的工作,假設您的自定義類:

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; 
} 

你需要一個類JAXB能理解,然後寫一個類和自定義類之間的適配器,就像這樣:

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); 
    } 
} 

現在你可以使用在自己的類,像這樣:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement 
public class Example2 { 
    @XmlSchemaType(name = "date") 
    @XmlJavaTypeAdapter(type=XMLGregorianCalendar.class,value =SillyDateAdapter.class) 
    public SillyDate publishingDate; 
} 

有大量的使用在網絡上提供的@XmlJavaTypeAdapter,像this onethis one,和其他幾個人的好例子。快樂適應!