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

shu*_*chi 4 java wsdl date

我正在开发一个应用程序,我们使用Spring webservices使用wsdl生成的文件调用第三方SAP系统.

使用wsdl到ws import生成的文件之一具有类型为"XMLGregorianCalendar"的Date属性,作为响应,我们为相应的字段获取空值.

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

已经提到:如何用Date替换XmlGregorianCalendar? 但无法通过wsdl提供适当的xjb绑定.

如果有人可以建议转换由wsdl生成的日期,那将会有很大帮助.....在此先感谢!术赤

Vad*_*dim 9

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

xjc -b <file>
Run Code Online (Sandbox Code Playgroud)

文档:自定义JAXB绑定

如果你使用Maven插件生成你的JAXB Java类,它们中的任何一个都有绑定配置,即

<groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <configuration>
                    <defaultOptions>
                        <bindingFiles>
                            <bindingFile>${project.interfaces.basedir}Configuration/Bindings/common-binding.xjb</bindingFile>
                        </bindingFiles>
Run Code Online (Sandbox Code Playgroud)

要么

<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>
Run Code Online (Sandbox Code Playgroud)

等等...

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>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它定义了从xsd:dateTime,xsd:date和xsd:time types到java.util.Calendar的转换.

我不建议使用java.util.Date.日期处理存在许多问题(特别是对于不同的时区).最好使用java.util.Calendar.日历更容易处理,JDK中有默认的转换器实现:

javax.xml.bind.DatatypeConverter
Run Code Online (Sandbox Code Playgroud)

但是,如果你仍然想使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

<jaxb:javaType name="java.util.Date" xmlType="xsd:dateTime"
    parseMethod="MyDatatypeConverter.parse"
    printMethod="MyDatatypeConverter.print" />
Run Code Online (Sandbox Code Playgroud)

  • “WSDL 与 xjb 没有任何关系。” 不确定你的意思。wsimport 调用 xjc。wsimport 接受传递给 xjc 的 **-b** *bindingsfile* 参数。 (3认同)

sah*_*ora 2

您必须创建自定义数据类型适配器并添加到绑定文件中。

 <jaxb:globalBindings>
    <xjc:serializable uid="-6026937020915831338" />
    <xjc:javaType name="java.util.Date" xmlType="xs:date" 
          adapter="com.test.util.jaxb.DateDataTypeAdapter" />
  </jaxb:globalBindings>
</jaxb:bindings>
Run Code Online (Sandbox Code Playgroud)

类 DateDataTypeAdapter

package com.test.util.jaxb;

import java.util.Calendar;
import java.util.Date;
import javax.xml.bind.DatatypeConverter;

public final class DataTypeAdapter {
    private DataTypeAdapter() { }

    public static Date parseDate(String s) {
        if (s == null) {
            return null;
        }

        return DatatypeConverter.parseDate(s).getTime();
    }

    public static String printDate(Date dt) {
        if (dt == null) {
            return null;
        }

        Calendar c = Calendar.getInstance();
        c.setTime(dt);

        return DatatypeConverter.printDate(c);
    }

    public static Date parseDateTime(String s) {
        if (s == null) {
            return null;
        }

        return DatatypeConverter.parseDateTime(s).getTime();
    }

    public static String printDateTime(Date dt) {
        if (dt == null) {
            return null;
        }

        Calendar c = Calendar.getInstance();
        c.setTime(dt);

        return DatatypeConverter.printDateTime(c);
    }
}
Run Code Online (Sandbox Code Playgroud)