2010-10-10 6 views
6

J'utilise CXF pour héberger des services Web dans un contexte Spring, ce qui fait de JAX-WS la liaison par défaut. Et j'utilise Java-First, ce qui signifie des interfaces et des classes de point de terminaison annotées.Comment indiquer à Apache CXF d'utiliser java.util.Date dans Spring Configuration

Depuis liaison par défaut pour JAX-WS utilise la classe XMLGregorianCalendar pour les dates, quand je l'appelle mon service web qui passe un java.util.Date il est converti en XMLGregorianCalendar sur le serveur.

Il y a beaucoup de messages et la documentation sur la façon de changer cela pour lier les valeurs de date à java.util.Date, mais tous sont liés à l'outil de wsdl2java, tels que:

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

Depuis que je suis avec Spring, je suis la recherche d'un moyen de le faire dans les fichiers de configuration de contexte de printemps (ou les fichiers de configuration CXF). Un extrait de mon dossier:

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

Dans le cas où quelqu'un a rencontré le même problème, je pourrait résoudre le mien en utilisant des annotations JAXB. Voir cette question: http://stackoverflow.com/questions/3953433/tell-jaxb-to-unmarshal-xsdatetime-to-date-class-using-annotations – Iravanchi

+0

Pouvez-vous être plus précis, à propos de quel artefact vous voulez personnaliser? Si c'est un artefact JAX-WS (SEI), fournissez un code Java pour l'interface. Ou si c'est le bean JAXB, montrez-nous le code généré. –

Répondre

5

La solution à votre problème est cachée dans la génération de classes.

Vous devez générer vos classes avec la liaison suivante:

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

Et inclure dans votre chemin de classe la classe suivante:

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

} 

Alors JAXB va inclure dans vos classes générées suivantes déclaration de type:

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

Confirmant que cette solution fonctionne. – heldt

+3

Cette solution peut fonctionner, mais peut-être vaut la peine de noter que SimpleDateFormat n'est pas thread-safe ... http://stackoverflow.com/questions/6840803 –

+0

@ Forge_7 existe-t-il une solution de sécurité commerciale? – kozla13

Questions connexes