java - 将 wsdl 生成的 XmlGregorianCalendar 类型的日期替换为 java.util.Date?

标签 java date wsdl

我正在开发一个应用程序,在该应用程序中,我们使用 Spring Web 服务通过 wsdl 生成的文件调用第三方 SAP 系统。

通过 ws 导入使用 wsdl 生成的文件之一具有“XMLGregorianCalendar”类型的 Date 属性,作为响应,我们得到相应字段的空值。

我想将日期从 XmlGregorianCalendar 转换为 java.util.Date。

引用:how replace XmlGregorianCalendar by Date? 但无法通过 wsdl 提供适当的 xjb 绑定(bind)。

如果有人可以建议转换由 wsdl 生成的日期,那将有很大帮助..... 提前致谢 ! 术赤

最佳答案

WSDL 与 xjb 没有任何关系。 xjb 适用于作为 -b 参数传递的 xjc 编译器。 即

xjc -b <file>

文档:Customizing JAXB Binding

如果您使用 Maven 插件来生成您的 JAXB Java 类,那么它们中的任何一个都具有绑定(bind)配置,即

<groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <configuration>
                    <defaultOptions>
                        <bindingFiles>
                            <bindingFile>${project.interfaces.basedir}Configuration/Bindings/common-binding.xjb</bindingFile>
                        </bindingFiles>

<plugin>
            <groupId>org.jvnet.jaxb2.maven2</groupId>
            <artifactId>maven-jaxb2-plugin</artifactId>
            <configuration>
                <schemaDirectory>${basedir}/src/main/resources/XMLSchema</schemaDirectory>
                <bindingDirectory>${basedir}/src/main/resources/Bindings</bindingDirectory>
            </configuration>

等等……

xjb 因为它很简单:

<jaxb:bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jaxb:extensionBindingPrefixes="xjc">
<jaxb:globalBindings>
    <jaxb:serializable uid="1" />
    <jaxb:javaType name="java.util.Calendar" xmlType="xsd:dateTime"
        parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"
        printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />
    <jaxb:javaType name="java.util.Calendar" xmlType="xsd:date"
        parseMethod="javax.xml.bind.DatatypeConverter.parseDate" printMethod="javax.xml.bind.DatatypeConverter.printDate" />
    <jaxb:javaType name="java.util.Calendar" xmlType="xsd:time"
        parseMethod="javax.xml.bind.DatatypeConverter.parseTime" printMethod="javax.xml.bind.DatatypeConverter.printTime" />            
</jaxb:globalBindings>

如您所见,它定义了从 xsd:dateTime、xsd:date 和 xsd:time 类型到 java.util.Calendar 的转换。

我不推荐使用 java.util.Date。日期处理有很多麻烦(尤其是不同时区)。 最好使用 java.util.Calendar。日历更容易处理,默认转换器实现在 JDK 中:

javax.xml.bind.DatatypeConverter

但是,如果您仍想使用 java.Util.Date,则需要拥有自己的带有两个静态方法“parse”和“print”的小型转换器,然后在 xjb 中进行设置。即

public class MyDateConverter {
    public static java.util.Date parse(String xmlDateTime) {
        return javax.xml.bind.DatatypeConverter.parseDateTime(xmlDateTime).getTime();
    }

    public static String print(Date javaDate) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(javaDate.getTime());
        return javax.xml.bind.DatatypeConverter.printDateTime(calendar);
    }
}

您在 xjb 中的转换将如下所示:

<jaxb:javaType name="java.util.Date" xmlType="xsd:dateTime"
    parseMethod="MyDatatypeConverter.parse"
    printMethod="MyDatatypeConverter.print" />

关于java - 将 wsdl 生成的 XmlGregorianCalendar 类型的日期替换为 java.util.Date?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40549526/

相关文章:

javascript - 我如何告诉 javascript 在序列化时不要将日期对象转换为 UTC

JavaFX - 如何清除 anchorPane 中的所有节点

java - 为什么在字段变量上同步并在同步块(synchronized block)内递增它会导致打印乱序?

java - 寻找 spring-hibernate3-2.0.8 源

java - Web 服务客户端调用 Web 服务客户端 - java

java - 我可以使用什么 Java 库来处理 WSDL 文件?

java - CXF 自动生成的 wsdl

java gson json对象数组到字符串数组

java - 月份和 java.util.Formatter

apache-spark - Pyspark 将带有日期和月份名称的日期时间字段解析为时间戳