我们有一个 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 中,我们使用映射来避免使用公历,但您可能可以使用它来进行转换。