2012-06-19 19 views
21

Devo esporre un livello di servizio ejb tramite jax-ws.come sostituire XmlGregorianCalendar per data?

Ho generato il servizio Web utilizzando jax-ws e wsimport ma sono fermato da una cosa strana; La data viene mappata su XmlGregorianCalendar. È possibile utilizzare invece la classica data java? Puoi mostrarmi il modo giusto di procedere?

Grazie. Modifica: questo il file di collegamento che ho usato: grazie, ho modificato leggermente il tuo xml e l'ho collegato con netbeans al webservice del client e ha funzionato. Questo è il legame che ho usato:

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

risposta

19

Non testato, ma dovrebbe funzionare. Per prima cosa creare tale classe:

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

} 

Quindi aggiungere questo al costume xjb di file:

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

Non testato, ma dovrebbe funzionare. Sulla base della mia risposta: JAX-WS and Joda-Time?

+0

grande soluzione, grazie! –

+0

Hey Tomasz Ho provato la tua soluzione e in realtà stavo generando i sorgenti usando il plugin maven. Ha generato tutte le fonti necessarie e ha generato Data piuttosto che XMLGregorianCalendar e ha anche annotato con @XmlJavaTypeAdapter (Adapter2 .class) @XmlSchemaType (name = "date") protected Date closedDate; ma il mio problema è che non riusciva a trovare XsdDateTimeConverter nelle classi dell'adattatore e c'era un errore di compilazione. Potete per favore aiutarmi su questo. – ROCKY

+0

Lo stesso problema qui. – Lyth

1

Grazie Tomasz. La soluzione sopra funziona.
Ma wsimport aggiunge anche il suo set di adattatori come Adapter1.java e Adapter2.java con il suo pacchetto org.w3._2001.xmlschema, che in realtà non corrisponde alla mia struttura del pacchetto.

Ho trovato un modo per modificare il nome di questo pacchetto utilizzando un altro bind jaxb. In realtà, ho cercato molto per questo e non sono riuscito a trovarlo facilmente, quindi lo aggiungo qui per chiunque cerchi lo stesso.

Aggiungere la seguente associazione nel file wsimport utilizzando '-b binding.xml'. Si noti che wsimport può funzionare con più file di bind.

binding.xml contenuto sotto:

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