java - 将 java.util.Date 映射到 xs :date instead of xs:dateTime in JAX-WS - 程序员与数组

博主在Oracle(BEA) OSB(AquaLogic)环境中遇到一个问题,其EJB Web服务使用的复杂pojo模型映射到xsd时,java.util.Date被映射为xs:dateTime。然而,代理服务的xsd需要的是xs:date。由于Oracle XQuery实现不支持从xs:date到xs:dateTime的转换,博主提出了手动转换的解决方案,并询问是否有更好的方法。最佳答案建议使用CXF的实用程序进行映射,提供了一段JAXB配置代码作为示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们有一个 EJB,jws 注释为 Web 服务。它有一个非常复杂的 pojo 模型,可以生成一个同样复杂的 xsd。 pojo 包含许多 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。只是,我找不到有关如何执行此操作的任何信息(注释?)。

谁能给我一个提示?

亲切的问候,
拉斯

最佳答案

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

根据您的架构是在 WSDL 中还是在单独的 URL 中,有两个选项(我知道您在 Java 优先配置中,但您正在尝试在代理端进行转换)。

<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 中,我们使用映射来避免使用公历,但您可能可以使用它来进行转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值