1、Apache cxf 学习笔记学习笔记(仅供内部使用)修订记录日期修订版本修改章节修改描述作者2011-06-201.00初稿完成易华军目 录1 CXF简介 41.1 CXF概述 41.2 CXF支持 41.2.1 协议标准 41.2.2 传输方式 41.3 CXF特点 51.3.1 灵活部署 51.3.2 支持多种编程语言 51.3.3 代码生成 61.4 CXF环境要求 62 实践讲解 62.1 CXF 开发例子 62.1.1 步骤图 62.1.2 步骤详解 82.2 CXF与Spring集成例子 112.2.1 步骤图 112.2.2 步骤详解 133 附录 163.1 cxf如何生成客
2、户端 163.2 cxf会用到的注解 (还未完善) 17导语:该文档主要讲解CXF的实践例子,包括纯CXF和Spring集成的两个例子。理论方面的知识还有待各位的完善。1 CXF简介本章主要简介CXF的理论知识。1.1 CXF概述CXF 是Celtix + Xfire的结合体,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支
3、持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。 1.2 CXF支持1.2.1 协议标准CXF支持多种协议标准:JAX-WS、 JAX-WSA、JSR-181 和 SAAJ;支持 SOAP 1.1、1.2、WS-I BasicProfile、WS-Security、WS-Addressing、WS-RM 和 WS-Policy;支持 WSDL 1.1 、2.0;支持 MTOM;1.2.2 传输方式CXF支持多种协议传输方
4、式:Bindings:SOAP、REST/HTTP;Data Bndings:目前支持 JAXB 2.0、Aegis 两种,默认是 JAXB 2.0。XMLBeans、Castor 和 JiBX 数据绑定方式将在 CXF 2.1 版本中得到支持;格式(Format):XML、JSON;传输方式:HTTP、Servlet、JMS 和 Jabber;可扩展 API :允许为 CXF 增加其它的 Bindings,以能够支持其它的消息格式,比如:CSV 和固定记录长度。1.3 CXF特点1.3.1 灵活部署轻量级容器:可在 Tomcat 或基于 Spring 的容器中部署 Services;集成 J
5、BI:可以在如 ServiceMix, OpenESB or Petals 等等的 JBI 容器中将它部署为一个服务引擎;集成 SCA:可以部署在如 Tuscany 之类的 SCA 容器中;集成 J2EE:可以在 J2EE 应用服务器中部署 Services,比如:Geronimo、JOnAS、JBoss、WebSphere Application Server 和 WebLogic Application Server,以及 Jetty 和 Tomcat;独立的 Java 客户端服务器。 1.3.2 支持多种编程语言全面支持 JAX-WS 2.0 客户端服务器编程模型;支持 JAX-WS 2
6、.0 synchronous、asynchronous 和 one-way APIs;支持 JAX-WS 2.0 Dynamic Invocation Interface (DII) API;支持 wrapped and non-wrapped 风格;支持 XML messaging API;支持 JavaScript 和 ECMAScript 4 XML (E4X) ,客户端与服务端均支持;通过 Yoko 支持 CORBA;通过 Tuscany 支持 SCA;通过 ServiceMix 支持 JBI ; 1.3.3 代码生成Java to WSDL;WSDL to Java;XSD to W
7、SDL;WSDL to XML;WSDL to SOAP;WSDL to Service;1.4 CXF环境要求CXF 框架是一种基于 Servlet 技术的 SOA 应用开发框架,要正常运行CXF,除了 CXF 框架本身之外,还需要 JDK 和 Servlet 容器的支持。2 实践讲解本章讲解使用CXF框架发布Web Services服务的两个例子。2.1 CXF 开发例子讲解使用CXF框架发布Web Services的例子。2.1.1 步骤图2.1.2 步骤详解下载CXF最新发布包下载地址http:/cxf.apache.org/download.html创建一个Web工程引入CXF ja
8、r包把前面下载的CXF包解压,进入lib目录。把所有jar包拷贝到刚创建的Web工程的lib目录。配置CXFServlet打开web.xml配置CXF的接入Servlet。样例如下: CXFServlet org.apache.cxf.transport.servlet.CXFServlet 1 CXFServlet /cxftest/* 编写待发布的接口下面编写一个简单的登录接口。样例如下:import javax.jws.WebService;WebServicepublic interface Login String login(String name, String password
9、);编写接口的实现类样例如下:import javax.jws.WebService;WebService(endpointInterface = com.test.service.cxf.Login, serviceName = Login)public class LoginImpl implements Login public String login(String name, String password) String result = 登录CXF 服务端成功!; if (!cxf.equalsIgnoreCase(name) | !cxf.equalsIgnoreCase(pa
10、ssword) result = 用户名或密码不正确,请重新登录!; return result; 编写发布服务类样例如下:import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import org.apache.cxf.jaxws.JaxWsServerFactoryBean;public class InitServlet extends HttpServlet Override public void init() throws ServletException LoginImpl logi
11、nImpl = new LoginImpl(); JaxWsServerFactoryBean jwpFactory = new JaxWsServerFactoryBean(); jwpFactory.setAddress(/Login); jwpFactory.setServiceClass(LoginImpl.class); jwpFactory.setServiceBean(loginImpl); jwpFactory.create(); 配置启动发布服务类前面我们把发布服务的类实现在一个Servlet里,所以把该类配置到web.xml里这样启动工程时就会发布Web Services。
12、样例如下:import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import org.apache.cxf.jaxws.JaxWsServerFactoryBean;public class InitServlet extends HttpServlet Override public void init() throws ServletException LoginImpl loginImpl = new LoginImpl(); JaxWsServerFactoryBean jwpFactor
13、y = new JaxWsServerFactoryBean(); jwpFactory.setAddress(/Login); jwpFactory.setServiceClass(LoginImpl.class); jwpFactory.setServiceBean(loginImpl); jwpFactory.create(); 发布工程并启动获取发布的WSDL访问发布的工程再拼加上CXF监听路径。如:http:/localhost:8080/StudyCXF/cxftest/Login?wsdl生成客户端代码查看 附录3.1 如何生成客户端代码。然后把生成的客户端代码放到客户端工程。提
14、示: 从生成的客户端代码中会有很多实际上我们用不到的源文件,可根据实际情况进行清理,这里只需要Login.java。编写客户端调用代码客户端一般是其它的系统,这里只讲解客户端在调用服务端的代码编写。样例如下:import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;public class CXFClient public static void main(String args) JaxWsProxyFactoryBean jwpFactory = new JaxWsProxyFactoryBean(); jwpFactory .setAddress
15、(http:/localhost:8080/StudyCXF/cxftest/Login?wsdl); jwpFactory.setServiceClass(Login.class); Login login = (Login) jwpFactory.create(); String result = login.login(cxf, cxf); System.out.println(登录结果: + result); 2.2 CXF与Spring集成例子讲解CXF与Spring集成发布Web Services的例子。2.2.1 步骤图2.2.2 步骤详解下载CXF最新发布包下载地址http:/
16、cxf.apache.org/download.html创建一个Web工程引入CXF jar包把前面下载的CXF包解压,进入lib目录。把所有jar包拷贝到刚创建的Web工程的lib目录。配置web.xml打开web.xml配置CXF的接入Servlet,和Spring的接入Listener。样例如下: contextConfigLocation WEB-INF/conf/beans.xml org.springframework.web.context.ContextLoaderListener CXFServlet org.apache.cxf.transport.servlet.CXFS
17、ervlet 1 CXFServlet /cxftest/* 提示:beans.xml是Spring的配置文件,请根据实际情况配置所在路径。后面配置服务端是在该文件里配置。编写待发布的接口下面编写一个简单的订单接口。样例如下:import javax.jws.WebParam;import javax.jws.WebService;WebServicepublic interface OrderProcess String processOrder(WebParam(name = Order) Order order);提示:更多的注解描述请查看 附录3.2 。编写接口的实现类样例如下:imp
18、ort javax.jws.WebService;WebService(endpointInterface = com.test.service.spring, serviceName = OrderProcess)public class OrderProcessImpl implements OrderProcess public String processOrder(Order order) String userName = order.getUserName(); return userName + 您好:订单处理成功,生成的订单号是:88888888; 提示:更多的注解描述请查看
19、 附录3.2 。配置服务端编辑beans.xml文件,配置服务端接口类。样例如下: !- - 提示:这里给出二种发布服务端接口的方式,随便哪一种都可以发布工程并启动获取发布的WSDL访问发布的工程再拼加上CXF监听路径。如:http:/localhost:8080/StudyCXFSpring/cxftest/OrderProcess?wsdl生成客户端代码查看 附录3.1 如何生成客户端代码。然后把生成的客户端代码放到客户端工程。客户端工程应该也是一个引入了CXF集成Spring包的工程,创建步骤同服务端工程。提示: 从生成的客户端代码中会有很多实际上我们用不到的源文件,可根据实际情况进行清
20、理,这里只需要Order.java,OrderProcess.java配置客户端在客户端工程中找到Spring的配置文件并配置如下内容。样例如下: 编写客户端调用代码客户端一般是其它的系统,这里只讲解客户端在调用服务端的代码编写。样例如下:import org.springframework.context.support.FileSystemXmlApplicationContext;public class CXFClient public static void main(String args) FileSystemXmlApplicationContext context = new
21、 FileSystemXmlApplicationContext( WebRoot/WEB-INF/conf/client-bean.xml); OrderProcess orderProcess = (OrderProcess) context.getBean(client); Order order = new Order(); order.setUserName(yihuajun); String result = orderProcess.processOrder(order); System.out.println(result); 3 附录3.1 cxf如何生成客户端 dos命令下
22、进入cxf解压目录的bin路径 ,输入如下命令:wsdl2java -d src -clienthttp:/localhost:8060/soa/services/otherTrackedVehicleSoapService?wsdlwsdl2java在cxf包中的bin路径下另外里面的src为生成代码存放路径,src必须手动创建。使用cxf wsdl2java或javax wsimport工具的时候,可能会遇到关于生成的Response类文件名冲突的问题WSDLToJavaError:ThrownbyJAXB:Aclass/interfacewiththesamenameXXX*isalre
23、adyinuse.Useaclasscustomizationtoresolvethisconflict.目前可选择的方案:1.使用-autoNameResolution自动处理wsdl2java -autoNameResolution http:/localhost:8060/soa/services/otherTrackedVehicleSoapService?wsdlorwsimport -p com.test.client -keephttp:/localhost:8060/soa/services/otherTrackedVehicleSoapService?wsdl-B-XautoNameResolution3.2 cxf会用到的注解 (还未完善)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1