2014-01-20 68 views
0

我正在嘗試編寫JAXB XMLAdapter,以便xs:dateTime字段不會創建爲XMLGregorianCalendar,而是創建爲joda DateTime從Calendar到Joda的JAXB適配器DateTime

但它並不像預期的那樣工作,特別是自動生成的適配器在類型間自動生成的某種程度上完全錯誤(wsdl2java)。但爲什麼?

<jaxb:globalBindings> 
    <jaxb:javaType name="org.joda.time.DateTime" xmlType="xsd:dateTime" 
     parseMethod="my.DateTimeAdapter.unmarshal" 
     printMethod="my.DateTimeAdapter.marshal" /> 
    </jaxb:globalBindings> 

public class DateTimeAdapter extends XmlAdapter<DateTime, Calendar>{ 

    @Override 
    public Calendar unmarshal(DateTime date) throws Exception { 
     return date.toGregorianCalendar(); 
    } 

    @Override 
    public DateTime marshal(Calendar date) throws Exception { 
     return new DateTime(date); 
    } 
} 

結果(自動生成):

public class Adapter1 
    extends XmlAdapter<String, Date> 
{ 


    public Date unmarshal(String value) { 
     return (javax.xml.bind.DatatypeConverter.parseDateTime(value)); 
    } 

    public String marshal(Date value) { 
     if (value == null) { 
      return null; 
     } 
     return (javax.xml.bind.DatatypeConverter.printDateTime(value)); 
    } 

} 

爲什麼結果定義的String, Date,而不是我的類型的適配器?

回答

1

這裏是解決方案,也爲我的個人參考:

  1. 您應該使用xjc:javaType直接定義XMLAdapter。否則,cxf會自動生成進一步的適配器,這些適配器必須映射到您自己的靜態方法。

    <jaxb:globalBindings> 
        <xjc:javaType name="org.joda.time.DateTime" 
         xmlType="xs:dateTime" 
         adapter="path.to.MyTimeAdapter" /> 
    </jaxb:globalBindings> 
    
  2. 你必須從String元帥您所需的類,而不是從XmlGregorianCalendar

    公共類MyTimeAdapter擴展XmlAdapter { @覆蓋 公衆的DateTime解組(字符串日期)拋出異常{ 返回新日期時間(日期); }

    @Override 
    public String marshal(DateTime date) throws Exception { 
        return date.toGregorianCalendar().toString(); 
    } 
    

    }