2010-10-10 16 views
6

Estoy usando CXF para alojar servicios web en un contexto de Spring, que hace que JAX-WS sea el enlace predeterminado. Y estoy usando Java-First, lo que significa interfaces y clases de punto final anotadas.Cómo decirle a Apache CXF que use java.util.Date en Spring Configuration

Desde vinculante para JAX-WS utiliza por defecto XMLGregorianCalendar clase para fechas, cuando llamo a mi servicio de banda que pasa un java.util.Date se convierte en XMLGregorianCalendar en el servidor.

Hay muchos mensajes y documentación sobre cómo cambiar este para unirse a los valores de fecha java.util.Date, pero todos están relacionados con la herramienta de wsdl2java, tales como:

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

Desde que estoy usando primavera, estoy buscando una forma de hacer esto en los archivos de configuración de contexto Spring (o archivos de configuración CXF). Un fragmento de mi archivo:

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

En caso de que alguien haya tenido el mismo problema, podría resolver el mío usando anotaciones JAXB. Consulte esta pregunta: http://stackoverflow.com/questions/3953433/tell-jaxb-to-unmarshal-xsdatetime-to-date-class-using-annotations – Iravanchi

+0

¿Puede ser más específico sobre qué artefacto desea personalizar? Si se trata de artefacto JAX-WS (SEI), entonces proporcione un código Java para la interfaz. O si ese es el bean JAXB, muéstranos el código generado. –

Respuesta

5

La solución para su problema está escondida en la generación de clases.

Debe generar sus clases con la continuación de la unión:

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

Y incluir en su ruta de clase de la clase siguiente:

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

} 

Entonces JAXB se va a incluir en sus clases generadas lo siguiente tipo de declaración:

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

Confirmando que esta solución funciona. – heldt

+3

Esta solución puede funcionar, pero vale la pena señalar que SimpleDateFormat no es seguro para subprocesos ... http://stackoverflow.com/questions/6840803 –

+0

@ Forge_7 ¿hay alguna solución segura? – kozla13

Cuestiones relacionadas