最新项目中须要用到webservices发布接口,以前项目用的都是xfire,因为框架中Spring版本缘由,xfire用不起来了,而后去搜了下,开源中国里找到了这段话:javascript
若是你要在新项目里用XFire,请改用CXF.CXF是XFire的延续,能够被看做是XFire2.0。CXF有不少新特性,且修复了不少XFire的bug,更重要的是CXF兼容JAX-WS!XFire将继续被维护和修复bug,可是新功能的开发都转移到了CXF上。详细信息请参考XFire/Celtix合并声明和CXF官网html
才发现xfire早在几年前就中止更新啦,转而替代产品是CXF(忽然发现公司框架好老土!),学习了下CXF,发现确实好用,配置简单,调用方便,具体貌似还有一些强大的功能,暂时没用到,不去深究,下面来简单介绍下CXF的具体使用。java
1、CXF项目下载web
一、首先CXF的官网地址 : http://cxf.apache.org/
注:当前最新版本是3.1.2,我用的是milestone版本3.0.0spring
二、下载相关压缩包(大约40-50M),解压缩到本地,这边主要用到里面的jar,固然不下载也行,关键方便学习嘛apache
2、项目集成api
一、项目所需jar包(俩种方式)浏览器
第一种方式: 能够直接经过maven配置下载,具体配置以下:markdown
<cxf.version>3.0.0-milestone1 </cxf.version> <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> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-tools-common</artifactId> <version>${cxf.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-tools-java2ws</artifactId> <version>${cxf.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-tools-validator</artifactId> <version>${cxf.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-tools-wsdlto-core</artifactId> <version>${cxf.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-tools-wsdlto-databinding-jaxb</artifactId> <version>${cxf.version}</version> </dependency>
第二种方式,直接经过下载下的压缩包,解压获取相关jar包,具体使用到的jar包以下:app
cxf-core-3.0.0-milestone1.jar cxf-rt-bindings-soap-3.0.0-milestone1.jar cxf-rt-bindings-xml-3.0.0-milestone1.jar cxf-rt-databinding-aegis-3.0.0-milestone1.jar cxf-rt-databinding-jaxb-3.0.0-milestone1.jar cxf-rt-frontend-jaxws-3.0.0-milestone1.jar cxf-rt-frontend-simple-3.0.0-milestone1.jar cxf-rt-javascript-3.0.0-milestone1.jar cxf-rt-transports-http-3.0.0-milestone1.jar cxf-rt-ws-addr-3.0.0-milestone1.jar cxf-rt-wsdl-3.0.0-milestone1.jar cxf-rt-ws-policy-3.0.0-milestone1.jar cxf-tools-common-3.0.0-milestone1.jar cxf-tools-java2ws-3.0.0-milestone1.jar cxf-tools-validator-3.0.0-milestone1.jar cxf-tools-wsdlto-core-3.0.0-milestone1.jar cxf-tools-wsdlto-databinding-jaxb-3.0.0-milestone1.jar cxf-tools-wsdlto-frontend-jaxws-3.0.0-milestone1.jar neethi-3.0.2.jar stax2-api-3.1.1.jar woodstox-core-asl-4.2.0.jar wsdl4j-1.6.3.jar xml-apis-1.0.b2.jar xml-resolver-1.2.jar xmlschema-core-2.0.3.jar
二、服务端webservices接口发布
首先配置web.xml
<!-- CXF 配置 --> <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>/ ws/*</url-pattern> </servlet-mapping>
而后编写业务接口(UserInfoService):
package com.quangao.service.webservice; import javax.jws.WebService; /** * Business Service Interface to handle communication between web and * persistence layer. * */ @WebService public interface UserInfoService { String getUser(); }
有接口必然要有接口实现(UserInfoServiceImpl):
package com.quangao.service.webservice.impl; import javax.jws.WebService; import com.quangao.service.webservice.UserInfoService; @WebService(endpointInterface = "com.quangao.service.webservice.UserInfoService", targetNamespace = " http://webservice.service.quangao.com/" public class UserInfoServiceImpl implements UserInfoService { public String getUser() { return " 钱猛 "; } }
接口写好以后就能够发布接口啦,具体配置以下(application.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:p=" http://www.springframework.org/schema/p " xmlns:tx=" http://www.springframework.org/schema/tx " xmlns:aop=" http://www.springframework.org/schema/aop " xmlns:jaxws=" http://cxf.apache.org/jaxws " xmlns:cxf=" http://cxf.apache.org/core " xsi:schemaLocation= " http://www.springframework.org/schema/beans http: //www.springframework.org/schema/beans/sprin g-beans-3.0.xsd http: //www.springframework.org/schema/tx http: //www.springframework.org/schema/tx/sprin g-tx-3.0.xsd http: //www.springframework.org/schema/aop http: //www.springframework.org/schema/aop/sprin g-aop-3.0.xsd http: //cxf.apache.org/jaxws http: //cxf.apache.org/schemas/jaxws.xsd" > <!-- 配置请参考官网: http://cxf.apache.org/docs/jax-rs-and-jax-ws.html -- <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <bean id="getInfoServiceImpl" class="com.quangao.service.webservice.impl.UserInfoServiceImpl" /> <!-- JAX-WS --> <!-- implementor 指定 WebService 实现类, address 指定访问地址 --> <jaxws:endpoint id="getInfoService" implementor="#getInfoServiceImpl" address="/getInfoService" publish="true" /> </beans>
发布完成后要进行测试发布接口是否成功,具体步骤以下:
一、根据web.xml中配置,在浏览器中输入webservice发布连接
例如http://localhost:8080/jssc_platform/ws
出现接口页面:
二、点击方法连接进入wsdl文件
如今服务端发布到此结束,下面就开始有客户端进行调用啦,调用方式有两种,一种是通用调用方式,一种是代理调用
通用调用方式:
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); // 方式1. 指定WSDL文件的url地址 org.apache.cxf.endpoint.Client client = dcf .createClient("http://localhost:8080/jssc-web/ws/getInfoService?wsdl"); // 方式2. 指定WSDL文件的绝对路径 // org.apache.cxf.endpoint.Client client = dcf.createClient("E:/cxf/getInfoService.wsdl"); // 方式3. classpath下的WSDL文件 // org.apache.cxf.endpoint.Client client = dcf.createClient("getInfoService.wsdl"); Object[] info = client.invoke("getUser"); if (info != null) { System.out.println("cxf 返回结果:" + info[0]); }
代理调用方式:
一、打开CMD命令行窗口,切换到apache-cxf-3.0.0/bin目录下,输入命令:
wsdl2java -p cn.com.webxml -d f:/ http://localhost:8080/ws//getInfoService?wsdl
注:-p 表示生成的JAVA客户端调用代码的包路径;-d 表示生成在本地哪一个目录下(本例为F盘根目录); 最后一个参数为WSDL文件路径(也能够是本地文件)
二、利用生成的工具类,直接调用webservices接口
UserInfoService_Service service = new UserInfoService_Service(); UserInfoService servicesop = service.getUserInfoServiceImplPort(); String userName = servicesop.getUser();
针对这俩种调用方式,我比较喜欢和经常使用的方式是第二种,这样能够根据用户提供的webservices接口直接生成本地接口文件,调用很是方便。
以上就是CXF应用的简单小结,我的认为比以前的Xfire好用多啦!