Apache CXF实现web service接口+客户端调用

来源:互联网 发布:网店网络广告宣传 编辑:程序博客网 时间:2024/06/06 04:45

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;@WebServicepublic 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;}}

4.然后在WEB-INF目录下新建cxf-servlet.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"xmlns:soap="http://cxf.apache.org/bindings/soap"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsdhttp://cxf.apache.org/jaxwshttp://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配置文件的路径。

最后项目文件分布:

图1

5.运行项目,在浏览器地址栏中输入:http://localhost:8080/MyApacheCXF/services/可以看到该项目发布的全部webservice接口方法和接口wsld文档路径

图2

点击wsld文档路径进入http://localhost:8080/MyApacheCXF/services/HelloWorld?wsdl,wsdl文档页,WebService发布成功;

图3


四、客户端调用webservice接口(客户端调用webservice需要服务端提供接口类)

         1.新建一个web项目,再将cxf解压后文件lib下的jar包全部导入项目中。然后在src下新建一个包,放入服务端提供的接口类,注意这里包名必须要和服务端的包名相同同时接口类中也要有@WebService注解。

接口类代码:

package com.cxf.service;import javax.jws.WebService;@WebServicepublic interface HelloWorld {public String sayHello(String str);}

2.再新建一个客户端测试类,调用接口

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

项目和注意事项结构:

图4


报错问题提示:

1.如果在接口类中没有@WebService注解,则会报如下错误。

图5

2.如果接口类的包名没有和服务端接口类包名一致则会报以下错误。

图6

3.如果报以下错误,着去检测客户端调用方法中的url是否书写有问题

图7

全部完成,最后献上途中使用的到的ApacheCXF框架及项目实例的资源下载路径:http://pan.baidu.com/s/1kTAADvD




1 0
原创粉丝点击