我正在开发一个应用程序,我们使用Spring webservices使用wsdl生成的文件调用第三方SAP系统.
使用wsdl到ws import生成的文件之一具有类型为"XMLGregorianCalendar"的Date属性,作为响应,我们为相应的字段获取空值.
我想将日期从XmlGregorianCalendar转换为java.util.Date.
已经提到:如何用Date替换XmlGregorianCalendar? 但无法通过wsdl提供适当的xjb绑定.
如果有人可以建议转换由wsdl生成的日期,那将会有很大帮助.....在此先感谢!术赤
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)
您必须创建自定义数据类型适配器并添加到绑定文件中。
<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)
| 归档时间: |
|
| 查看次数: |
15782 次 |
| 最近记录: |