cxf 怎么根据cxf生成wsdl文件件生成异步的客户端和服务端

1.根据wsdl文件生成相关代码wsdl2java用法: wsdl2java -p com -d src -all
aa.wsdl -p
生成代码的包名: -d
指定要产生代码所在目录 -client 生成web service客户端代码 -server 生成web
service服务器代码 -impl 生成web service的实现代码 -ant
生成build.xml文件 -all 生成所有代码:types,service proxy,,service interface, server mainline, client mainline,2、maven依赖:&properties&
&cxf.version&2.7.12&/cxf.version&&/properties&&dependency&
&groupId&org.apache.cxf&/groupId&
&artifactId&cxf-rt-frontend-jaxws&/artifactId&
&version&${cxf.version}&/version&
&/dependency&
&dependency&
&groupId&org.apache.cxf&/groupId&
&artifactId&cxf-rt-transports-http&/artifactId&
&version&${cxf.version}&/version&
&/dependency&3、web.xml&?xml version="1.0" encoding="UTF-8"?&&web-app id="WebApp_ID" version="2.4"xmlns="/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/j2ee
&display-name&qy-game-base&/display-name&&context-param&&param-name&contextConfigLocation&/param-name&&param-value&classpath:spring/applicationContext.xml&/param-value&&/context-param& &listener&&listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&&/listener&
&listener&
&listener-class&org.springframework.web.util.IntrospectorCleanupListener&/listener-class&
&/listener& &servlet&
&servlet-name&CXFService&/servlet-name&
&servlet-class&org.apache.cxf.transport.servlet.CXFServlet&/servlet-class&&/servlet& &servlet-mapping&
&servlet-name&CXFService&/servlet-name&
&url-pattern&/cxf/*&/url-pattern&&/servlet-mapping&&/web-app&4、applicationContext.xml&?xml version="1.0" encoding="UTF-8"?&
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation = "http://www.springframework.org/schema/beans
&import resource="classpath:META-INF/cxf/cxf.xml" /&
&import resource="classpath:META-INF/cxf/cxf-extension-http.xml" /&
&import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /&
&jaxws:endpoint
id = "dataSyncService"
address = "/dataSyncService"
implementorClass = "com.qy.crack.mm.action.DataSync" &
&jaxws:implementor &
id = "dataSyncController"
class = "com.qy.crack.mm.action.DataSyncController" &
&/jaxws:implementor &
&/jaxws:endpoint &
遇到错误:org.apache.cxf.interceptor.Fault: Unmarshalling Error: 意外的元素 (uri:"http://schema.ib.", local:"ID")。所需元素为&{}ID&,&{}type& 原因:因为在客户端传过来的xml中对属性&ns2:userID&
&ns3:ID xmlns:ns3=""&&/ns3:ID&&ns4:type xmlns:ns4=""&1&/ns4:type& &/ns2:userID&添加了命名空间,而我生成的代码中,命名空间是空的,所以报错,只要将@XmlElement(name = "ID", namespace = "", required = true)填入namespace=“”即可import javax.xml.bind.annotation.XmlAccessTimport javax.xml.bind.annotation.XmlAccessorTimport javax.xml.bind.annotation.XmlEimport javax.xml.bind.annotation.XmlT@XmlAccessorType(XmlAccessType.FIELD)@XmlType(name = "UserID", namespace = "http://www.csapi.org/schema/parlayx/data/v1_0", propOrder = {
"type"})public class UserID {
@XmlElement(name = "ID", namespace = "", required = true)
protected S
@XmlElement(namespace = "")
possible object is
{@link String }
public String getID() {
* @param value
allowed object is
{@link String }
public void setID(String value) {
public int getType() {
public void setType(int value) {
this.type =
如果您想留下此文,您可以将其发送至您的邮箱(将同时以邮件内容&PDF形式发送)
相关文章推荐
(Ctrl+Enter提交) &&
已有0人在此发表见解
&在& 19:20收藏到了
&&在信息爆炸的时代,您的知识需要整理,沉淀,积累!Lai18为您提供一个简单实用的文章整理收藏工具,在这里您可以收藏对您有用的技术文章,自由分门别类,在整理的过程中,用心梳理自己的知识!相信,用不了多久,您收藏整理的文章将是您一生的知识宝库!
· 蜀ICP备号-1webservice CXF整合spring服务端测试并生成wsdl文件
& & 首先到CXF官网及spring官网下载相关jar架包,这个不多说。webservice是干嘛用的也不多说。
& & 模拟新增一个用户,并返回新增结果,成功还是失败。
& &大概的目录如上,很简单。
ResultInfo.java
package com.fei.webservice.user.
import java.text.MessageF
import javax.xml.bind.annotation.XmlAccessorT
import javax.xml.bind.annotation.XmlA
import javax.xml.bind.annotation.XmlT
import javax.xml.bind.annotation.XmlAccessT
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = &ResultInfo&, namespace = &http://bean.user./&)
public class ResultInfo {
@XmlAttribute(required = true)
@XmlAttribute
public ResultInfo(){
public ResultInfo(String code,String message){
this.code =
this.message =
public String getCode() {
public String getMessage() {
public void setCode(String code) {
this.code =
public void setMessage(String message) {
this.message =
public String toString() {
return MessageFormat
.format(&[code={0},message={1}]&,
IUserService.java
package com.fei.webservice.
import javax.jws.WebP
import javax.jws.WebS
import com.fei.webservice.user.bean.ResultI
@WebService
public interface IUserService {
ResultInfo createUser(
@WebParam(name = &name&) String name,
@WebParam(name = &password&) String password);
UserService.java
package com.fei.webservice.
import javax.jws.WebS
import com.fei.webservice.user.bean.ResultI
@WebService(
endpointInterface = &com.fei.webservice.user.IUserService&,
targetNamespace = &http://user./&,
serviceName = &IUserService&)
public class UserService implements IUserService{
public final String SUCCESS = &0000&;
public final String FAIL = &1001&;
public ResultInfo createUser(String name, String password) {
System.out.println(&新增用户:name=&+name+&,password=&+password);
//通知第三方操作结果
return new ResultInfo(SUCCESS,&用户新增成功!&);
ServerStart.java
package com.
import javax.xml.ws.E
import com.fei.webservice.user.UserS
public class ServerStart {
public static void deployService() {
System.out.println(&Server start ……&);
UserService service = new UserService();
String address = &http://localhost:9000/userService&;
Endpoint.publish(address, service);
public static void main(String[] args) throws InterruptedException {
//发布WebService
deployService();
System.out.println(&server ready ……&);
ServerStart.java是用来发布接口的,可以理解为像tomcat那样启动后,浏览器就可以访问了。
ClientTest.java
package com.
import org.apache.cxf.jaxws.JaxWsProxyFactoryB
import com.fei.webservice.user.IUserS
public class ClientTest {
public static void main(String[] args) {
//调用WebService
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(IUserService.class);
factory.setAddress(&http://localhost:9000/userService&);
IUserService service = (IUserService) factory.create();
System.out.println(&[result]& + service.createUser(&张三&, &1111&));
ClientTest.java模拟第三方调用接口。也就是对服务端(ServerStart.java启动的那个)是否成功,客户端和服务端的通讯是否OK。
& & 执行ServerStart.java,看到这样的信息:
& &启动OK。接下来,用浏览器访问,看看是否有xml格式的内容。
& 访问地址:http://localhost:9000/userService?wsdl
& &好了,服务端OK了,我们用客户端来调用服务端的接口,看看效果。
& 测试方法一:
& &执行ClientTest.java,控制台显示如下信息:
& &可以看到服务端返回了一个结果对象ResultInfo给客户端,告诉客户服务端新增用户成功了。
& 测试方法二
& & 使用SOUP-UI来测试,自己网上下载。
CXF整合spring
& 在WEB-INF下新增一个spring-cxf.xml文件(和web.xml同目录)。
&?xml version=&1.0& encoding=&UTF-8&?&
&beans xmlns=&http://www.springframework.org/schema/beans&
xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xmlns:jaxws=&http://cxf.apache.org/jaxws&
xsi:schemaLocation=&
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd&&
&import resource=&classpath:META-INF/cxf/cxf.xml& /&
&import resource=&classpath:META-INF/cxf/cxf-extension-soap.xml& /&
&import resource=&classpath:META-INF/cxf/cxf-servlet.xml& /&
&jaxws:endpoint id=&userService&
implementor=&com.fei.webservice.user.UserService&
address=&/userService& /&
&?xml version=&1.0& encoding=&UTF-8&?&
&web-app version=&3.0&
xmlns=&/xml/ns/javaee&
xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xsi:schemaLocation=&/xml/ns/javaee
/xml/ns/javaee/web-app_3_0.xsd&&
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&/WEB-INF/spring-cxf.xml&/param-value&
&/context-param&
&listener&
&listener-class&org.springframework.web.context.ContextLoaderListener&/listener-class&
&/listener&
&servlet-name&CXFServlet&/servlet-name&
&servlet-class&org.apache.cxf.transport.servlet.CXFServlet&/servlet-class&
&load-on-startup&1&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&CXFServlet&/servlet-name&
&url-pattern&/cxf/*&/url-pattern&
&/servlet-mapping&
&welcome-file-list&
&welcome-file&index.jsp&/welcome-file&
&/welcome-file-list&
&/web-app&
& 将项目部署到tomcat下,启动tomcat。
&浏览器访问:http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl
& &测试也有2种方法,和上面一样,只是改变访问地址而已,这里就不重复了。
生成wsdl文件
& & 服务端代码完成,并发布之后,我们需要将接口的信息生成一个wsdl文件,给第三方,第三方拿到wsdl文件后,通过工具生成代码。
& &方法一:
& &最方便,最快捷的办法。服务端启动后,浏览器访问时,得到的信息,将网页另存为,文件的后缀用.wsdl,这样就得到wsdl文件了。
& 注意:用这种方法,浏览器使用IE,本人试过百度浏览器,360浏览器,网页另存时,它会将一些html的标签也搞出来了。wsdl文件是一个xml格式的文件。
& 推荐使用方法一,方法二生成的wsdl文件有点问题,不知道是工具的问题还是代码写漏了哪些注解配置。
& &方法二:
& & 使用cxf的java2wsdl.bat工具来生成。
& & 简单点的:
& & & 将classes文件下的com全部copy到cxf工具的bin目录下。cmd打开DOS窗口切换到bin目录下,然后使用命令
& & java2wsdl -cp ./com com.fei.webservice.user.IUserService
& &自动生成了IUserServiceService.wsdl文件。
& 麻烦点的:
& 1.打包,将代码打包成jar
& 在桌面上生成一个userservice.jar包,把该包copy到java2wsdl.bat的同目录下.cmd开打DOS窗口,切换到java2wsdl.bat目录下。执行命令:
java2wsdl -cp .\userservice.jar com.fei.webservice.user.IUserService
&然后在目录下,会生成一个IUserService.wsdl文件。
验证wsdl文件
& & 生成了wsdl文件,交给第三方之前,最好验证一下,使用它能否正确生成代码。
& & & 用记事本或者浏览器打开查看wsdl文件,拉到最后,看看wsdl:port name那里是否和通过
http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl访问得到的一致。
& & 上面介绍wsdl文件的生成用了2中方法。方法一通过IE浏览器的另存为得到wsdl文件,我命名为userService.wsdl.方法二通过java2wsdl自动生成的wsdl文件为IUserServiceService.wsdl.
& & &查看userService.wsdl
& &上面红色框圈住的部分是我们期待的。
& &接下来查看IUserServiceService.wsdl文件
& 发现居然不是我们期待的,本人暂时找不到原因,为何导致这样。我们就暂时使用方法一来生成wsdl文件吧
& 通过wsdl2java.bat工具,生成客户端源码,看看能否正确生成。
& cmd打开DOS窗口,切换到wsdl2java.bat目录下,使用命令:
wsdl2java -client -server -impl .\userService.wsdl
& 在同目录下,会生成代码
& &为了方便,查看生成的代码的结构,我新建一个java项目,把新生成的代码copy进去。
& & &我们来看看图上用箭头指向的那个类。
package com.fei.webservice.
import java.net.MalformedURLE
import java.net.URL;
import javax.xml.namespace.QN
import javax.xml.ws.S
import javax.xml.ws.WebE
import javax.xml.ws.WebServiceC
import com.fei.webservice.user.IUserS
* This class was generated by Apache CXF (incubator) 2.0.4-incubator
* Sat Jun 28 15:05:37 CST 2014
* Generated source version: 2.0.4-incubator
@WebServiceClient(name = &IUserService&, targetNamespace = &http://user./&, wsdlLocation = &file:./userService.wsdl&)
public class IUserService_Service extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName(&http://user./&, &IUserService&);
public final static QName UserServicePort = new QName(&http://user./&, &UserServicePort&);
url = new URL(&file:./userService.wsdl&);
} catch (MalformedURLException e) {
System.err.println(&Can not initialize the default wsdl from file:./userService.wsdl&);
// e.printStackTrace();
WSDL_LOCATION =
public IUserService_Service(URL wsdlLocation) {
super(wsdlLocation, SERVICE);
public IUserService_Service(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
public IUserService_Service() {
super(WSDL_LOCATION, SERVICE);
returns UserServicePort
@WebEndpoint(name = &UserServicePort&)
public IUserService getUserServicePort() {
return (IUserService)super.getPort(UserServicePort, IUserService.class);
& & 看到了吗?
& &@WebServiceClient(name = &IUserService&, targetNamespace = &http://user./&
& &@WebEndpoint(name = &UserServicePort&)
& &特别是UserServicePort一定要和用浏览器访问服务端时界面显示的那个一样(上面截图中用红色框圈住的那个wsdl:port name = &UserServicePort&)
验证wsdl生成的代码是否可用
& & & &把wsdl文件给第三方之前,一定要确保wsdl文件是没问题的,生成出来的代码也是OK的。所以把wsdl文件给第三方之前还有最后一步要做。验证wsdl生成的代码是否可用.
& &看到上面给的目录结构图了吗?我新曾了org.fei.service.UserService.java以及UserServiceTest.java
& &UserService.java
package org.fei.
import java.net.URL;
import com.fei.webservice.user.IUserS
import com.fei.webservice.user.IUserService_S
import com.fei.webservice.user.bean.ResultI
public class UserService {
private final static String _URL = &http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl&;
//wsdl生成的接口
private IUserService userS
public UserService()
userService = new IUserService_Service(new URL(_URL)).getUserServicePort();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(&用户接口初始化连接出错!&,e);
public boolean addUser(String name,String password){
boolean isSuccess =
ResultInfo result = userService.createUser(name, password);
if(&0000&.equals(result.getCode())){
isSuccess =
System.out.println(&新增用户操作结果:成功!&);
isSuccess =
System.out.println(&新增用户操作结果:失败!&);
} catch (Exception e) {
e.printStackTrace();
isSuccess =
return isS
UserServiceTest.java
package org.fei.
public class UserServiceTest {
public static void main(String[] args) {
UserService userService = new UserService();
userService.addUser(&张三&, &123&);
把服务端tomcat启动,然后执行UserServiceTest.java看到运行结果:
& &到这一步,就可以放心把wsdl文件给对方了。
& & 作为服务端,我们需要把wsdl文件给第三方,并告知我们的访问地址,如本例访问地址:http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?CXF利用wsdl2java生成客户端时Date日期类型转换 - 坚持学习 - ITeye技术网站
博客分类:
在利用CXF的wsdl2java生成客户端时,默认情况下java的Date类型会自动转换成XMLGregorianCalendar,如果想生成Date类型,该怎样处理?答案如下:
1.生成配置文件(一般取名为jaxb-binding-date.xml,可放在任意路径下,只是在运行wsdl2java时使用):
&jaxws:bindings
xmlns:jaxws="/xml/ns/jaxws"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="/xml/ns/jaxb"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"&
&jaxws:bindings
node="wsdl:definitions/wsdl:types/xs:schema
[@targetNamespace='/']"&
&jxb:globalBindings xmlns:jxb="/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema"&
&jxb:javaType name="java.util.Date" xmlType="xs:dateTime"
parseMethod="org.apache.mon.DataTypeAdapter.parseDateTime"
printMethod="org.apache.mon.DataTypeAdapter.printDateTime"/&
&/jxb:globalBindings&
&/jaxws:bindings&
&/jaxws:bindings&
这里需要注意的一点是:targetNamespace需要替换成自己的目标命名空间(可以在wsdl服务中看到)
2.然后再在cmd下运行wsdl2java:
wsdl2java -p com.jd.crm.plaintdetails -b D:\cxf\jaxb-binding-date.xml -d D:\cxf
http://localhost:9090/services/complaintDetails?wsdl
参数说明:
-p: 生成的客户端代码所在的包路径
-b: jaxb-binding-date.xml文件的路径
-d: 生成的客户端代码的本地存放路径
http://localhost:9090/services/complaintDetails?wsdl
webservice服务端wsdl访问路径
penwei 写道cwfmaker 写道penwei 写道这段配置放到什么位置地方?可以放在任何地方,只需要在运行wsdl命令的时候,参数里面添加就行,比如: -b D:\cxf\jaxb-binding-date.xml再我的程序中不会用到wsdl命令,现在的情况是:例如我的服务端已经写好了接口add(Entity po ),在我的业务客户端调用这个接口,传递的po中包含一个DateTime属性,服务端接收到这个po后DateTime这个属性的值为空,其他的String\Long...类型的对象都有值!所以我实在看不出你的这个配置文件放到哪儿?你生成的客户端代码里的package-info类@javax.xml.bind.annotation.XmlSchema(namespace = "http://webservice.service.crm.***.com/")package com.***.crm.是否有上面那个注解?我们没有通过哦wsdl文件生成客户端,
cwfmaker 写道penwei 写道这段配置放到什么位置地方?可以放在任何地方,只需要在运行wsdl命令的时候,参数里面添加就行,比如: -b D:\cxf\jaxb-binding-date.xml再我的程序中不会用到wsdl命令,现在的情况是:例如我的服务端已经写好了接口add(Entity po ),在我的业务客户端调用这个接口,传递的po中包含一个DateTime属性,服务端接收到这个po后DateTime这个属性的值为空,其他的String\Long...类型的对象都有值!所以我实在看不出你的这个配置文件放到哪儿?你生成的客户端代码里的package-info类@javax.xml.bind.annotation.XmlSchema(namespace = "http://webservice.service.crm.***.com/")package com.***.crm.是否有上面那个注解?
penwei 写道这段配置放到什么位置地方?
可以放在任何地方,只需要在运行wsdl命令的时候,参数里面添加就行,比如:
-b D:\cxf\jaxb-binding-date.xml
再我的程序中不会用到wsdl命令,现在的情况是:例如我的服务端已经写好了接口add(Entity po ),在我的业务客户端调用这个接口,传递的po中包含一个DateTime属性,服务端接收到这个po后DateTime这个属性的值为空,其他的String\Long...类型的对象都有值!所以我实在看不出你的这个配置文件放到哪儿?
这段配置放到什么位置地方?可以放在任何地方,只需要在运行wsdl命令的时候,参数里面添加就行,比如: -b D:\cxf\jaxb-binding-date.xml
浏览: 349188 次
来自: 北京
多谢楼主,问题解决,主要就是svn版本不同导致的
lanmolsz 写道无法同意楼主的说法,楼主所谓的晚捕捉就是 ...
无法同意楼主的说法,楼主所谓的晚捕捉就是典型的让异常控制程序的 ...
倒是怀疑这个功能来着NO Code直接根据Wsdl生成SOAP报文,发送http请求调用web service - melin - ITeye技术网站
博客分类:
&&& 作为客户端调用web service通用的做法,通常利用axis或cxf生成客户端代码,如果调用的服少还能应付,如果调用服务比较多,生成的代码很多,很难管理,自己以前就是这样干。 想到过wsdl解析生成soap报文,再通过httpclient发送请求,由于各种服务类型和服务样式,兼容性很难处理,没有去实施。
&&& 最近接触soapui和camel时间比较多,从这两个工具中找到我想要的代码和思路。能够解决各种服务类型和服务样式兼容性问题......& 直接通过一个实例来演示怎么调用,效果更比较清楚些。
实例描述:创建一个用户,返回值和参数都市javabean User.(其它参数类型如此)
解析的SOAP报文如下:
&soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:demo="http://demo./"&
&soapenv:Header/&
&soapenv:Body&
&demo:createUser&
&!--Optional:--&
&!--Optional:--&
&address&?&/address&
&!--Optional:--&
&name&?&/name&
&/demo:createUser&
&/soapenv:Body&
&/soapenv:Envelope&
需要的参数为:
Map&String, Object& params = new HashMap&String, Object&();
params.put("createUser.arg0.address", "Anhui Hefei");
params.put("createUser.arg0.name", "melin");
params.put("dumpSOAP", "");
map的key值为body下面的xpath路径。这种方式,主要是为了解决复杂参数的传值。
dumpSOAP是为了打印出soap报文替换参数前后的内容。
替换参数后的soap报文
&soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:demo="http://demo./"&
&soapenv:Header/&
&soapenv:Body&
&demo:createUser&
&!--Optional:--&
&!--Optional:--&
&address&Anhui Hefei&/address&
&!--Optional:--&
&name&melin&/name&
&/demo:createUser&
&/soapenv:Body&
&/soapenv:Envelope&
调用返回一个map
Map&String, String& result = client.sendRequest("createUser", params, wsdlUrl);
返回内容
{createUserResponse.return.address=Anhui Hefei, createUserResponse.return.name=melin}
//----------------------------完整代码-----------------------------
public static void main(String[] args) throws Exception {
String wsdlUrl = "http://localhost:9000/helloWorld?wsdl";
SoapClient client = new SoapClient();
Map&String, Object& params = new HashMap&String, Object&();
params.put("createUser.arg0.address", "Anhui Hefei");
params.put("createUser.arg0.name", "melin");
params.put("dumpSOAP", "");
Map&String, String& result = client.sendRequest("createUser", params, wsdlUrl);
System.out.println(result);
整个测试工程:/svn/trunk/SOAPUtil
论坛回复 /
(0 / 4399)
浏览: 493125 次
来自: 合肥
你好,工程测试地址为404,求最新地址
楼主能否共享个项目给看看呢?我也遇到这个问题。 ...
com.starit.DynamicRouterTest这个类 ...
问一下 Persion类有什么特殊要求吗?

我要回帖

更多关于 cxf wsdl生成客户端 的文章

 

随机推荐