2010-10-10 12 views
6

Sto utilizzando CXF per ospitare i servizi Web in un contesto Spring, che rende JAX-WS l'associazione predefinita. E sto usando Java-First, che significa interfacce e classi endpoint annotate.Come comunicare a Apache CXF di utilizzare java.util.Date in Spring Configuration

Dal vincolante per JAX-WS predefinito utilizza XMLGregorianCalendar classe per le date, quando chiamo il mio servizio web passando un java.util.Date viene convertita in XMLGregorianCalendar sul server.

Ci sono molti posti e la documentazione su come cambiare questo per associare i valori di data di java.util.Date, ma tutti sono legati a strumento WSDL2Java, come ad esempio:

<jaxws:bindings wsdlLocation="YOUR_WSDL_LOCATION" 
      xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
      xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='THE_NAMESPACE_OF_YOUR_SCHEMA']"> 
     <jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
     <jxb:javaType name="java.util.Date" xmlType="xs:dateTime" 
         parseMethod="org.apache.cxf.tools.common.DataTypeAdapter.parseDateTime" 
         printMethod="org.apache.cxf.tools.common.DataTypeAdapter.printDateTime"/> 
     </jxb:globalBindings> 
    </jaxws:bindings> 
</jaxws:bindings> 

Dal momento che sto usando Primavera, io sono cercare un modo per farlo in Primavera nei file di configurazione del contesto (o nei file di configurazione CXF). Uno snippet del mio file:

<jaxws:endpoint id="jaxwsDocumentGroupWsEndpoint" implementor="#documentGroupWsEndpoint" address="/documentGroup"> 
<!-- SOMETHING TO WRITE HERE TO TELL CXF TO USE java.util.Date ??? --> 
</jaxws:endpoint> 
+1

Nel caso in cui qualcuno abbia riscontrato lo stesso problema, io potrebbe risolvere il mio usando annotazioni JAXB. Vedi questa domanda: http://stackoverflow.com/questions/3953433/tell-jaxb-to-unmarshal-xsdatetime-to-date-class-using-annotations – Iravanchi

+0

Puoi essere più specifico su quale artefatto vuoi personalizzare? Se si tratta di artefatto JAX-WS (SEI), fornire un codice Java per l'interfaccia. O se quello è bean JAXB, mostraci il codice generato. –

risposta

5

La soluzione per il tuo problema è nascosta nella generazione di classe.

È necessario generare le vostre classi con il seguente legame:

<jaxb:globalBindings generateMixedExtensions="true"> 
     <jaxb:javaType 
      name="java.util.Calendar" 
      xmlType="xs:dateTime"   
      parseMethod="com.test.DataTypeBinder.unmarshalDateTime" 
      printMethod="com.test.DataTypeBinder.marshalDateTime" /> 

</jaxb:globalBindings> 

E includere nel percorso della classe la seguente classe:

public class DataTypeBinder { 
private static DateFormat dateTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
    private static DateFormat date = new SimpleDateFormat("yyyy-MM-dd"); 

    public static Calendar unmarshalDate(String value) { 
     if (value == null || value.length() == 0) { 
      return null; 
     } 
     Date d = null; 

     try { 
      d = date.parse(value); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
     Calendar c = Calendar.getInstance(); 
     c.setTime(d); 
     return c; 
    } 

    public static String marshalDate(Calendar value) { 
     if (value == null) { 
      return null; 
     } 

     return date.format(value.getTime()); 
    } 


    public static Calendar unmarshalDateTime(String value) { 
     if (value == null || value.length() == 0) { 
      return null; 
     } 
     Date d = null; 

     try { 
      d = dateTime.parse(value); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
     Calendar c = Calendar.getInstance(); 
     c.setTime(d); 
     return c; 
    } 

} 

Poi JAXB sta per includere nelle classi generato il seguente tipo di dichiarazione:

@XmlElement(type = String.class) 
@XmlJavaTypeAdapter(Adapter1 .class) 
@XmlSchemaType(name = "dateTime") 
protected Calendar transactionDate; 
+0

Conferma che questa soluzione funziona. – heldt

+3

Questa soluzione potrebbe funzionare, ma potrebbe valere la pena notare che SimpleDateFormat non è sicuro da thread ... http://stackoverflow.com/questions/6840803 –

+0

@ Forge_7 esiste una soluzione sicura per il commercio? – kozla13

Problemi correlati