2010-03-15 105 views
6

我想自定義JAXB中日期的編組。這是已經詢問的question的變體。我想我會使用XMLAdapter,因爲this answer問題指定。如何自定義JAXB編組(如果從XML生成JAXB bean)

但是我無法完全做到這一點,因爲我反其道而行,從.XSD生成JAXB bean - 我無法將註釋添加到JAXB bean,因爲它們是生成的代碼。

我試過調用Marshaller.setAdapter(),但沒有運氣。

  final Marshaller marshaller = getJaxbContext().createMarshaller(); 
      marshaller.setSchema(kniSchema); 
      marshaller.setAdapter(new DateAdapter()); 
      ... 
      private static class DateAdapter extends XmlAdapter<String, XMLGregorianCalendar> { 
      @Override 
      public String marshal(XMLGregorianCalendar v) throws Exception { 
       return "hello"; //Just a test to see if it's working 
      } 
      @Override 
      public XMLGregorianCalendar unmarshal(String v) throws Exception { 
       return null; // Don't care about this for now 
      } 
} 

凡我所產生的JAXB bean的相關部分看起來是這樣的:

@XmlSchemaType(name = "date") 
    protected XMLGregorianCalendar activeSince; 

當我這樣做,有什麼默認日期/編組的XMLGregorianCalendar發生。就好像我沒有做到這一點。

任何幫助表示讚賞。

謝謝,

查爾斯

回答

2

改變對XJC生成的Java結合的類型的優選的方法是使用一個綁定定製。

https://jaxb.dev.java.net/guide/Using_different_datatypes.html

JAXB有一個內置的表 決定了Java類是用來 代表什麼XML架構內置 類型,但是這是可以定製的。

一個常見的用例 定製與 友好的日曆或日期更換 的XMLGregorianCalendar。 的XMLGregorianCalendar的設計是與XML模式的 日期/時間系統 100%兼容,如提供在亞秒級 無限的精度和 年,但經常使用的便利性 的那些熟悉的Java類險勝 精確兼容性。

該網頁並不在這裏告訴你如何實際線了定製,雖然如此,看看,看看如何做到這一點:

http://jaxb.java.net/tutorial/section_5_6_1-Overriding-the-Datatype.html#Overriding%20the%20Datatype

+0

謝謝,這工作。我是JAXB的新手,並沒有意識到你可以像這樣定製綁定。 – 2010-03-16 16:54:52

+0

該java.net網站已被關閉,因此該教程URL不再起作用。該教程是否有新的URL? – 2017-09-05 19:34:44