2010-10-10 62 views
6

我使用CXF在Spring上下文中托管Web服务,这使得JAX-WS成为默认绑定。我正在使用Java-First,这意味着带注释的端点接口和类。由于JAX-WS的缺省绑定使用日期的XMLGregorianCalendar类,当我呼叫我的web服务传递java.util.Date时,它将在服务器上转换为XMLGregorianCalendar如何告诉Apache CXF在Spring配置中使用java.util.Date

有很多帖子和文档,了解如何更改此日期值绑定到java.util.Date,但都涉及到WSDL2Java工具,如:

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

由于我使用的是春天,我寻找一种在Spring上下文配置文件(或CXF配置文件)中执行此操作的方法。我的文件的片段:

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

如果有人遇到同样的问题,我可以使用JAXB注释解决我的问题。看到这个问题:http://stackoverflow.com/questions/3953433/tell-jaxb-to-unmarshal-xsdatetime-to-date-class-using-annotations – Iravanchi 2010-10-18 07:59:25

+0

你可以更具体,关于你想要自定义什么工件?如果它是JAX-WS工件(SEI),那么为接口提供Java代码。或者如果这是JAXB bean,请向我们展示生成的代码。 – 2011-11-21 16:50:17

回答

5

您的问题的解决方案隐藏到类生成中。

您应该下面的结合产生的类:

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

而在你的类路径包括以下类:

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

} 

然后JAXB会在生成的类包括以下型号声明:

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

确认此解决方案有效。 – heldt 2011-12-20 09:27:41

+3

此解决方案可能会工作,但值得注意的是SimpleDateFormat不是线程安全的... http://stackoverflow.com/questions/6840803 – 2014-04-07 15:25:53

+0

@ Forge_7有没有贸易安全的解决方案? – kozla13 2014-08-26 11:51:42