一、引入cxf3
我这里使用的是最新的版本cxf3.1.8
引入cxf3需要在pom.xml加入如下内容:
org.apache.cxf
cxf-rt-frontend-jaxws
3.1.8
org.apache.cxf
cxf-rt-transports-http
3.1.8
二、项目中增加对cxf3的支持
1、修改web.xml,增加如下内容不:
CXF Endpoint
cxf
cxf
org.apache.cxf.transport.servlet.CXFServlet
2
cxf
/services/*
2、添加spring的配置文件application-cxf.xml,内容如下(web.xml中扫描spring配置文件需要增加对这个配置文件的扫描):
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
注意看上面有服务端以及客户端的示例声明,下面会给出编写服务端及客户端的具体代码
三、编写服务端代码
1、application-cxf.xml文件中添加声明:
2、接口文件DemoWebservice.java,代码如下:
packagecom.huarui.web.webservice;importjavax.jws.WebService;
@WebServicepublic interfaceDemoWebservice {publicString queryBaseTx();publicString queryBaseTxById(String id);
}
3、实现文件DemoWebserviceImpl.java,代码如下:
packagecom.comp.web.webservice.impl;importjava.util.List;importjavax.jws.WebService;importorg.springframework.beans.factory.annotation.Autowired;importcom.google.gson.Gson;importcom.comp.mapping.entity.BasetxEntity;importcom.comp.service.jdbc.BasetxService;importcom.comp.web.webservice.DemoWebservice;
@WebService(endpointInterface= "com.comp.web.webservice.DemoWebservice")public class DemoWebserviceImpl implementsDemoWebservice {
@AutowiredprivateBasetxService basetxService;publicString queryBaseTx() {
List list=basetxService.findAll();return newGson().toJson(list);
}publicString queryBaseTxById(String id) {
BasetxEntity basetx=basetxService.findById(id);return newGson().toJson(basetx);
}
}
重启项目,用这个地址就可以访问我们创建的服务列表了 http://localhost:8080/App/services/
对于我们刚才创建的服务的访问地址为:http://localhost:8080/App/services/demo?wsdl
路径中services对应的是web.xml文件中配置的内容
demo?wsdl对应的是application-cxf.xml文件中的address属性
四、编写客户端代码
1、application-cxf.xml文件中添加声明:
2、controller类中,添加如下代码:
@Autowired
@Qualifier("demoClient")privateDemoWebservice demo;
......
String result=demo.queryBaseTx();
System.out.println(result);
com.comp.web.webservice.DemoWebservice是基于服务端的接口实现,本来是要重新写的,我这里偷了个懒,直接用了服务端的代码
Qualifier注解里面的demoClient对应的是application-cxf.xml配置里面jaxws:client标签的id属性
com.comp.web.webservice.DemoWebservice是接口,没有实现类,通过jaxws:client标签调用服务地址生成实现类
五、编写客户端代码(第二种方式)
这种方式不需要配置application-cxf.xml文件
在controller类中,添加如下代码:
URL wsdlURL = new URL("http://localhost:8080/App/services/demo?wsdl");
QName SERVICE_NAME= new QName("http://impl.webservice.web.comp.com/", "DemoWebserviceImplService");
Service service=Service.create(wsdlURL, SERVICE_NAME);
DemoWebservice client= service.getPort(DemoWebservice.class);
String result=client.queryBaseTx();
System.out.println(result);
我建议使用第一种方式,第二种方式这个QName需要从服务端接口里去找,然后我想说的是,QName并不太好找,写错了代码执行会报错。
我这里把我生成的服务端wsdl的内容贴出来:
注意看一下,这个QName里面的参数对应的是wsdl:definitions标签里面的targetNamespace属性和name属性
六、编写客户端代码(第三种方式)
我这里不再介绍这种方法
我生成客户端代码的命令是:
wsdl2java -p com.comp.web.client -d d:\web\client -client http://localhost:8080/App/services/demo?wsdl