在Java JAX-WS中将java.util.Date映射到xs:date而不是xs:dateTime

时间:2010-05-31 08:57:37

标签: java datetime date jax-ws

我们有一个EJB,jws-anotated as a web service。它有一个相当复杂的pojo模型,可以生成同样复杂的xsd。 pojos包含许多java.util.Date。这些都映射到xs:dateTime。

此服务在Oracle(BEA)OSB(AquaLogic)中用作“业务服务”。我们还有一个“代理服务”,我们使用XQuery(OSB / AquaLogic方式)映射到BS。代理服务的xsd具有相应字段的xs:date。 出于某种原因,Oracle的XQuery实现不支持从xs:date转换为xs:dateTime(!)。

我可以通过转换为xs:string并使用“T00:00:00”来解决这个问题,但是,我宁愿尝试让JAX-WS生成带xs:date的xsd。只是,我找不到任何关于如何做到这一点的信息(anotations?)。

任何人都可以给我一个提示吗?

亲切的问候, 拉斯

1 个答案:

答案 0 :(得分:2)

我不是特别了解Oracle,但对于CXF,有一些实用程序可以执行此映射。您可能能够为您的配置找到类似的适配器。看看下面的页面。 http://cxf.apache.org/docs/wsdl-to-java.html

根据您在WSDL中的架构或单独的URL中有两个选项(我知道您在Java第一个配置中,但是您尝试在Proxy端进行转换)。

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

XSD:外部,JAXB语法

<jxb:bindings version="2.0"
              xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <jxb:bindings schemaLocation="file:<path><name>.xsd" node="/xs: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>
  </jxb:bindings>
</jxb:bindings>

在我们的CXF中,我们使用映射来避免使用格里高利历,但您可以使用它来进行转换。