Apache CXF实现web service接口+客户端调用
Apache CXF百度百科:
介绍:
ApacheCXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。
关于ApacheCXF:
ApacheCXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。
功能特性:
CXF包含了大量的功能特性,但是主要集中在以下几个方面:
支持 Web Services 标准:CXF 支持多种 Web Services 标准,包含 SOAP、Basic Profile、WS-Addressing、WS-Policy、WS-ReliableMessaging和 WS-Security。Frontends:CXF 支持多种“Frontend”编程模型,CXF 实现了JAX-WS API(遵循 JAX-WS 2.0 TCK 版本),它也包含一个“simple frontend”允许客户端和 EndPoint 的创建,而不需要 Annotation 注解。CXF 既支持WSDL优先开发,也支持从Java 的代码优先开发模式。容易使用: CXF 设计得更加直观与容易使用。有大量简单的 API 用来快速地构建代码优先的 Services,各种 Maven 的插件也使集成更加容易,支持 JAX-WS API ,支持 Spring 2.0 更加简化的 XML 配置方式,等等。支持二进制和遗留协议:CXF 的设计是一种可插拨的架构,既可以支持 XML ,也可以支持非 XML 的类型绑定,比如:JSON 和 CORBA。
CXF开发web service:
一、参考资源:
1.http://blog.sina.com.cn/s/blog_59ca2c2a0101dfj0.html
2.http://mushme.iteye.com/blog/1776078
3.http://cxf.apache.org/
二、框架下载:
官网:http://cxf.apache.org/
官网下载:http://mirrors.cnnic.cn/apache/cxf/3.0.4/apache-cxf-3.0.4.zip
云盘下载:参考文档最后提供的路径
三、webservice接口开发实例
CXF是apache旗下的开源框架,由Celtix+ XFire这两门经典的框架合成,是一套非常流行的web service框架。它提供了JAX-WS的全面支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者WSDL优先(WSDL First)来轻松地实现 Web Services 的发布和使用,同时它能与spring进行完美结合。以下将在一个简单的web项目中添加CXF实现web service接口的发布
以下开发环境及工具:
1.window764为Pc机
2.Tomcat7.0 window 64位版本
3.Eclipse 3.7 window 64位版本
4.火狐浏览器36.0.1版本
5.Apache-cxf-3.0.4版本
1.下载Apache cxf 框架的压缩包解压,新建一个web项目,再将cxf解压后文件lib下的jar包全部导入项目中。
2.在项目的web.xml中添加配置来引入cxf框架,配置如下
<servlet> <servlet-name>cxf</servlet-name> <servlet-class> org.apache.cxf.transport.servlet.CXFServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>
3.然后在src下新建包,再在包下新建一个service接口和一个实现类。注意,接口类中一定要加上@Web Service注解,代码如下:
接口HelloWorld:
package com.cxf.service; import javax.jws.WebService; @WebService public interface HelloWorld { public String sayHello(String str); }
实现类HelloWorldImp
package com.cxf.service; import javax.jws.WebService; public class HelloWorldImp implements HelloWorld { public String sayHello(String str) { return "hello "+str; } }
<?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" xmlns:soap="http://cxf.apache.org/bindings/soap" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <jaxws:server id="jaxwsService" serviceClass="com.cxf.service.HelloWorld" address="/HelloWorld"> <jaxws:serviceBean> <bean class="com.cxf.service.HelloWorldImp" /> </jaxws:serviceBean> </jaxws:server> </beans>
jaxws:server中:id:该server的唯一标识
serviceClass:该web service接口的接口类路径
address:该接口的访问标识,即接口下的访问子路径
jaxws:serviceBean中: bean中的class对应着接口的实现类路径
其他博客中的解释:
jaxws:server中的id随便取,只要不重复就行。serviceClass是接口的全路径名,address是WebService的地址的一部分,WebService发布之后,地址就是http://主机:端口/工程名/在web.xml文件中配置的CXFServlet的url模式/在cxf-servlet.xml文件的jaxws:server标签中配置的address属性的值?wsdl。以我的这个工程为例,主机是本地,端口是tomcat默认的8080,工程名是“MyApacheCXF”,在web.xml文件中配置的CXFServlet的url-pattern是“/services”,在cxf-servlet.xml文件的jaxws:server标签中配置的address属性的值“/HelloWorld”,那么我的WebService的WSDL地址就是:http://localhost:8080/MyApacheCXF/services/HelloWorld?wsdl。
当然你也可以自己设置WebService配置文件的路径和文件名,方法就是在web.xml文件的CXFServlet配置中增加<init-param>的节点,param-name的值是“config-location”,param-value节点的值就是你自己定义的WebService配置文件的路径。
最后项目文件分布:
5.运行项目,在浏览器地址栏中输入:http://localhost:8080/MyApacheCXF/services/可以看到该项目发布的全部webservice接口方法和接口wsld文档路径
点击wsld文档路径进入http://localhost:8080/MyApacheCXF/services/HelloWorld?wsdl,wsdl文档页,WebService发布成功;
四、客户端调用webservice接口(客户端调用webservice需要服务端提供接口类)
1.新建一个web项目,再将cxf解压后文件lib下的jar包全部导入项目中。然后在src下新建一个包,放入服务端提供的接口类,注意这里包名必须要和服务端的包名相同,同时接口类中也要有@WebService注解。
接口类代码:package com.cxf.service; import javax.jws.WebService; @WebService public interface HelloWorld { public String sayHello(String str); }
package com.cxf.service; import org.apache.cxf.interceptor.LoggingInInterceptor; import org.apache.cxf.interceptor.LoggingOutInterceptor; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; public class TestClient { public static void main(String[] args) { JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.getInInterceptors().add(new LoggingInInterceptor()); factory.getOutInterceptors().add(new LoggingOutInterceptor()); factory.setServiceClass(HelloWorld.class); factory.setAddress("http://localhost:8080/MyApacheCXF/services/HelloWorld"); HelloWorld client = (HelloWorld) factory.create(); String reply = client.sayHello("admin"); System.out.println("Server said: " + reply); } }
3.运行控制台打印:Serversaid: hello admin
项目和注意事项结构:
报错问题提示:
1.如果在接口类中没有@WebService注解,则会报如下错误。
2.如果接口类的包名没有和服务端接口类包名一致则会报以下错误。
3.如果报以下错误,着去检测客户端调用方法中的url是否书写有问题
全部完成,最后献上途中使用的到的ApacheCXF框架及项目实例的资源下载路径:http://pan.baidu.com/s/1kTAADvD