2012-06-19 21 views
21

Muszę odsłonić warstwę usługi ejb za pośrednictwem jax-ws.jak zamienić XmlGregorianCalendar według daty?

Wygenerowałem usługę WWW przy użyciu jax-ws i wsimport, ale jestem zatrzymany przez dziwne rzeczy; Data jest mapowana do XmlGregorianCalendar. Czy można zamiast tego używać klasycznej daty java? Czy możesz pokazać mi właściwy sposób postępowania?

Dzięki. Edycja: to plik powiązania użyłem: dzięki, trochę zmodyfikowałem twój xml i przyłączyłem go netbeans do webservice klienta i zadziałało. To wiązanie użyłem:

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

Odpowiedz

19

Nie testowane, ale powinno działać. Najpierw utworzyć taką klasę:

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

} 

Następnie dodać do tego zwyczaju xjb plik:

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

nie testowane, ale powinien działać. Na podstawie mojej odpowiedzi tutaj: JAX-WS and Joda-Time?

+0

Świetne rozwiązanie, dzięki! –

+0

Hej Tomasz, wypróbowałem Twoje rozwiązanie i faktycznie generowałem źródła przy użyciu wtyczki maven. Wygenerował wszystkie potrzebne źródła i wygenerował Date, a nie XMLGregorianCalendar, a także przypisano go do @XmlJavaTypeAdapter (Adapter2 .class) @XmlSchemaType (name = "date") protected Date closedDate; ale mój problem polega na tym, że nie mógł znaleźć XsdDateTimeConverter w klasach adapterów i wystąpił błąd kompilacji. Czy możesz mi w tym pomóc? – ROCKY

+0

Ten sam problem tutaj. – Lyth

1

Dzięki Tomasz. Powyższe rozwiązanie działa.
Ale wsimport dodaje również swój zestaw Adapterów, takich jak Adapter1.java i Adapter2.java, wraz z pakietem org.w3._2001.xmlschema, który naprawdę nie pasuje do mojej własnej struktury pakietów.

Znalazłem sposób na zmianę nazwy tego pakietu przy użyciu innego wiązania jaxb. Właściwie to dużo szukałem i nie mogłem tego łatwo znaleźć, więc dodaję to tutaj dla każdego, kto szuka tego samego.

Dodaj następujące powiązanie w programie wsimport za pomocą opcji "-b binding.xml". Zauważ, że wsimport może pracować z wieloma plikami wiążącymi.

binding.xml treść poniżej:

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