import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
private XMLGregorianCalendar convertToXMLGregorianCalendar(Date date) {
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(date);
XMLGregorianCalendar gc = null;
try {
gc = DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);
} catch (DatatypeConfigurationException e) {
LOG
.debug(
"There are some error for convert java.util.Date to XMLGregorianCalendar",
e);
}
return gc;
}
Remark:
由于在使用CXF的 wsdl2java 生成Java客户端时,JAXB(默认)把java.util.Date类型解释为 XMLGregorianCalendar,所以在客户端调用的时候,也需要传入XMLGregorianCalendar参数来对应Date类型,此上是一种解决办法。
----------------------------------------------------------------------------------------------
默认情况下,JAXB将xsd:date, xsd:time, 和xsd:dateTime映射为XMLGregorianCalendar , 对于从java开始构建service的人,很少会直接用到这个类, 一般情况下我们都是用java.util.Date或者java.util.Calendar, 调用apache cxf 的java2wsdl, 我们得到的wsdl 的schema部分是xsd:dateTime, 当你再次调用wsdl2java来生产impl的时候,你会发现这个impl根本无法编译, 因为impl里是用的是XMLGregorianCalendar , 而SEI则是java.util.Date或者java.util.Calendar
那么如何才能使得wsdl2java生产的impl里,也是java.util.Date或者java.util.Calendar呢?
答案就是使用jaxws/jaxb 的customization。 jaxb允许我们做数据类型的转换,类javax.xml.bind.DatatypeConverter, 就是用来做这个的。
但是,jaxb只为我们做了xsd:date 到java.util.Calendar, java.util.Date需要自己来完成,好在我已经把这个代码放到了apache cxf里org.apache.cxf.tools.common.DataTypeAdapter
这里给出一个简单的例子,注意jaxb customzation部分是嵌入在schema里的
<xs schema elementformdefault="qualified" version="1.0" xmlns xs="http://www.w3.org/2001/XMLSchema" jaxb="http://java.sun.com/xml/ns/jaxb" version="2.0" targetnamespace="calendar-schemalet">
<xs annotation> <xs appinfo>
<jaxb globalbindings>
<jaxb javatype name="java.util.Calendar" xmltype="xs:date" parsemethod="javax.xml.bind.DatatypeConverter.parseDate" printmethod="javax.xml.bind.DatatypeConverter.printDate" />
</jaxb globalbindings>
</xs appinfo></xs annotation>
</xs schema>
那么上面这段代码就可以把xsd:date转换为java.util.Calendar了,而且是全局替换
如果你需要转换的schema类型是dateTime, 那么parseMethod 的parseDate就得改成parseDateTime, printMethod 也是类似。
这里再给一个java.util.Date的例子, 假设我们需要映射xsd:time 到java.util.Date,那么我们可以这些写:
<xs schema elementformdefault="qualified" version="1.0" xmlns xs="http://www.w3.org/2001/XMLSchema" jaxb="http://java.sun.com/xml/ns/jaxb" version="2.0" targetnamespace="calendar-schemalet">
<xs annotation> <xs appinfo>
<jaxb globalbindings>
<jaxb javatype name="java.util.Date" xmltype="xs:time" parsemethod="org.apache.cxf.tools.common.DataTypeAdapter.parseTime" printmethod="org.apache.cxf.tools.common.DataTypeAdapter.printTime" />
</jaxb globalbindings>
</xs appinfo></xs annotation>
</xs schema>
分享到:
相关推荐
cxf+spring+client+springmvc
Web Service Cxf转换器的示例,包含源码和jar包。
02.CXF功能概述_CXF发展历史和使用CXF开发WebService服务器端
本实例是基于CXF的一个客户端的实现,使用maven生成客户端代码,集成spring配置客户端实现类,访问外部接口。“CXF契约优先开发方式”中的实例为服务器端代码。
赠送jar包:cxf-rt-rs-client-3.0.1.jar; 赠送原API文档:cxf-rt-rs-client-3.0.1-javadoc.jar; 赠送源代码:cxf-rt-rs-client-3.0.1-sources.jar; 赠送Maven依赖信息文件:cxf-rt-rs-client-3.0.1.pom; 包含...
使用CXF开发Web Service,包含服务器端和客户端
cxf spring server client demo.rar soap webservice
04.使用CXF处理JavaBean式的复合类型和List集合类型的形参和返回值
springboot整合CXF发布webservice和客户端调用 项目中每个类都有详细的注释,保证都能看懂,不失为一个学习springboot整合cxf来学习webservice发布调用的好例子
cxf client
07.处理Map等CXF无法自动转换的复合数据类型的形参和返回值
cxf的具体实现,包括了转换器,和webservice的发布
NULL 博文链接:https://wang-z-p2007.iteye.com/blog/2083332
Cxf客户端及服务器端,实现客户端和服务器端的权限验证,可以直接运行,很简单,开始研究cxf的时候很少有权限验证的资源,所有我实现 了之后,拿来跟大家分享
使用cxf webservice时容易出现的异常
使用spring集成cxf,在两个web ...server端使用spring+springmvc+mybatis+cxf,client端使用struts2+spring+hibernate+cxf 两个工程均为myeclipse project,包含所有除myeclipse自带以外所有jar 内附 使用文档,数据库脚本
NULL 博文链接:https://jin8000608172.iteye.com/blog/1768378
这是我在使用cxf+spring进行开发中的一点总结,如何搭建开发环境、如何配置dao使用,如何解决乱码问题等的经验分享
使用CXF开发简单HelloWorld实例
java CXF客户端请求ERP SAP webservice通过用户名和密码验证功能!