2012-06-19 68 views
21

我必須通過jax-ws公開一個ejb服務層。如何用日期替換XmlGregorianCalendar?

我已經使用jax-ws和wsimport生成了web服務,但我被一個奇怪的事物阻止了;日期正被映射到XmlGregorianCalendar。 是否有可能使用經典的java日期呢? 你能告訴我正確的方法嗎?

謝謝。 編輯: 這是我使用的綁定文件: 謝謝,我稍微修改了你的xml,並將它與NetBeans連接到客戶端的webservice,它工作。這使用的綁定:

<jaxws:bindings node="wsdl:definitions/wsdl:types/xsd:schema" 
       xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 

           xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 

           xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 

           xmlns:xsd="http://www.w3.org/2001/XMLSchema" wsdlLocation="../wsdl/localhost_8080/web_test/Testor.wsdl" > 


<jaxb:globalBindings> 
      <jaxb:javaType name="java.util.Date" 
     xmlType="xsd:dateTime" 
     parseMethod="lol.XsdDateTimeConverter.unmarshal" 
     printMethod="lol.XsdDateTimeConverter.marshalDateTime"   
      /><jaxb:javaType 
     name="java.util.Date" 
     xmlType="xsd:date" 
     parseMethod="lol.XsdDateTimeConverter.unmarshal" 
     printMethod="lol.XsdDateTimeConverter.marshalDate" 
     /> 
     </jaxb:globalBindings> 


</jaxws:bindings> 

回答

19

未測試,但應該工作。首先,創建這樣的類:

import javax.xml.bind.DatatypeConverter; 

public class XsdDateTimeConverter { 

    public static Date unmarshal(String dateTime) { 
     return DatatypeConverter.parseDate(dateTime).getTime(); 
    } 

    public static String marshalDate(Date date) { 
     final GregorianCalendar calendar = new GregorianCalendar(); 
     calendar.setTime(date); 
     return DatatypeConverter.printDate(calendar); 
    } 

    public static String marshalDateTime(Date dateTime) { 
     final GregorianCalendar calendar = new GregorianCalendar(); 
     calendar.setTime(dateTime); 
     return DatatypeConverter.printDateTime(calendar); 
    } 

} 

然後將其添加到自定義xjb文件:

<javaType 
     name="java.util.Date" 
     xmlType="xs:dateTime" 
     parseMethod="XsdDateTimeConverter.unmarshal" 
     printMethod="XsdDateTimeConverter.marshalDateTime" 
     /> 
<javaType 
     name="java.util.Date" 
     xmlType="xs:date" 
     parseMethod="XsdDateTimeConverter.unmarshal" 
     printMethod="XsdDateTimeConverter.marshalDate" 
     /> 
</globalBindings> 

沒有測試,但應該工作。基於我的答案在這裏:JAX-WS and Joda-Time?

+0

的最佳解決方案,謝謝! –

+0

嘿Tomasz我試過你的解決方案,我實際上是使用maven插件生成源代碼。它確實生成了所有必要的源代碼,它確實生成了Date而不是XMLGregorianCalendar,並且它也使用@XmlJavaTypeAdapter(Adapter2 .class)註解了@ 0XmlSchemaType(name =「date」) protected Date closedDate;但我的問題是它無法找到適配器類中的XsdDateTimeConverter並且出現編譯錯誤。你能幫我解決這個問題嗎? – ROCKY

+0

這裏同樣的問題。 – Lyth

1

感謝Tomasz。上述解決方案有效。
但是wsimport還增加了一套適配器,如Adapter1.java和Adapter2.java及其包org.w3._2001.xmlschema,它確實不符合我自己的軟件包結構。

我找到了一種方法來使用另一個jaxb綁定來更改此軟件包名稱。其實,我搜索了很多,找不到這個,所以我在這裏爲任何尋找相同的人添加它。

使用'-b binding.xml'在wsimport中添加以下綁定。請注意,wsimport可以處理多個綁定文件。下面

binding.xml內容:

<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    jaxb:version="2.0"> 
    <annotation><appinfo> 
    <jaxb:schemaBindings> 
     <jaxb:package name="com.abc.xyz.utils"/> 
    </jaxb:schemaBindings> 
    </appinfo></annotation> 
</schema> 
相關問題