CXF实现WebService
WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单
WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单关键字: webservice cxf soaWebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单现在的项目中需要用到SOA概念的地方越来越多,最近我接手的一个项目中就提出了这样的业务要求,需要在.net开发的客户端系统中访问java开发的web 系统,这样的业务需求自然需要通过WebService进行信息数据的操作。
下面就将我们在开发中摸索的一点经验教训总结以下,以供大家参考.在WebService开发笔记 2 -- VS 2005 访问WebServcie更简单中作一个跨平台访问WebServcie服务的例子....在WebService开发笔记 3 -- 增强访问 WebService 的安全性通过一个简单的用户口令验证机制来加强一下WebService的安全性....我们项目的整个架构使用的比较流行的WSH MVC组合,即webwork2 + Spring + Hibernate;1.首先集成Apacha CXF WebService 到 Spring 框架中;apache cxf 下载地址:/dist/incubator/cxf/2.0.4-incubator/apache -cxf-2.0.4-incubator.zip在spring context配置文件中引入以下cxf配置Xml代码1.<import resource="classpath*:META-INF/cxf/cxf.xml"/>2.<import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml"/>3.<import resource="classpath*:META-INF/cxf/cxf-servlet.xml"/>在web.xml中添加过滤器:Xml代码1.<servlet>2.<servlet-name>CXFServlet</servlet-name>3.<servlet-class>4. org.apache.cxf.transport.servlet.CXFServlet5.</servlet-class>6.</servlet>7.<servlet-mapping>8.<servlet-name>CXFServlet</servlet-name>9.<url-pattern>/services/*</url-pattern>10.</servlet-mapping>2.开发服务端WebService接口:Java代码1./**2. * WebService接口定义类.3. *4. * 使用@WebService将接口中的所有方法输出为Web Service.5. * 可用annotation对设置方法、参数和返回值在WSDL中的定义.6. */7.@WebService8.public interface WebServiceSample {9.10.11. /**12. * 一个简单的方法,返回一个字符串13. * @param hello14. * @return15. */16. String say(String hello);17.18. /**19. * 稍微复杂一些的方法,传递一个对象给服务端处理20. * @param user21. * @return22. */23. String sayUserName(24. @WebParam(name = "user")25. UserDTO user);26.27. /**28. * 最复杂的方法,返回一个List封装的对象集合29. * @return30. */31. public32. @WebResult(partName="o")33. ListObject findUsers();34.35.}由简单到复杂定义了三个接口,模拟业务需求;3.实现接口Java代码1./**2. * WebService实现类.3. *4. * 使用@WebService指向Interface定义类即可.5. */6.@WebService(endpointInterface = ".examples.webservice.WebServiceSample")7.public class WebServiceSampleImpl implements WebServiceSample {8.9. public String sayUserName(UserDTO user) {10. return "hello "+user.getName();11. }12.13. public String say(String hello) {14. return "hello "+hello;15. }16.17. public ListObject findUsers() {18. ArrayList<Object> list = new ArrayList<Object>();19.20. list.add(instancUser(1,"lib"));21. list.add(instancUser(2,"mld"));22. list.add(instancUser(3,"lq"));23. list.add(instancUser(4,"gj"));24. ListObject o = new ListObject();25. o.setList(list);26. return o;27. }28.29. private UserDTO instancUser(Integer id,String name){30. UserDTO user = new UserDTO();31. user.setId(id);32. user.setName(name);33. return user;34. }35.}4.依赖的两个类:用户对象与List对象Java代码1./**2. * Web Service传输User信息的DTO.3. *4. * 分离entity类与web service接口间的耦合,隔绝entity类的修改对接口的影响.5. * 使用JAXB 2.0的annotation标注JAVA-XML映射,尽量使用默认约定.6. *7. */8.@XmlAccessorType(XmlAccessType.FIELD)9.@XmlType(name = "User")10.public class UserDTO {11.12. protected Integer id;13.14. protected String name;15.16. public Integer getId() {17. return id;18. }19.20. public void setId(Integer value) {21. id = value;22. }23.24. public String getName() {25. return name;26. }27.28. public void setName(String value) {29. name = value;30. }31.}关于List对象,参照了有关JWS的一个问题中的描述:DK6.0 自带的WebService 中 WebMethod的参数好像不能是ArrayList 或者其他List传递List需要将List 包装在其他对象内部才行 (个人理解如有不对请指出) ,我在实践中也遇到了此类问题.通过以下封装的对象即可以传递List对象.Java代码1./**2. * <p>Java class for listObject complex type.3. *4. * <p>The following schema fragment specifies the expected content contained within this class.5. *6. * <pre>7. * <complexType name="listObject">8. * <complexContent>9. * <restriction base="{/2001/XMLSchema}anyType">10. * <sequence>11. * <element name="list" type="{/2001/XMLSchema}anyType" maxOccurs="unbounded" minOccurs="0"/>12. * </sequence>13. * </restriction>14. * </complexContent>15. * </complexType>16. * </pre>17. *18. *19. */20.@XmlAccessorType(XmlAccessType.FIELD)21.@XmlType(name = "listObject", propOrder = { "list" })22.public class ListObject {23.24. @XmlElement(nillable = true)25. protected List<Object> list;26.27. /**28. * Gets the value of the list property.29. *30. * <p>31. * This accessor method returns a reference to the live list,32. * not a snapshot. Therefore any modification you make to the33. * returned list will be present inside the JAXB object.34. * This is why there is not a <CODE>set</CODE> method for the list property.35. *36. * <p>37. * For example, to add a new item, do as follows:38. * <pre>39. * getList().add(newItem);40. * </pre>41. *42. *43. * <p>44. * Objects of the following type(s) are allowed in the list45. * {@link Object }46. *47. *48. */49. public List<Object> getList() {50. if (list == null) {51. list = new ArrayList<Object>();52. }53. return this.list;54. }55.56. public void setList(ArrayList<Object> list) {57. this.list = list;58. }59.60.}5.WebService 服务端 spring 配置文件 ws-context.xmlXml代码1.<beans xmlns="/schema/beans"2.xmlns:xsi="http://www.w/2001/XMLSchema-instance"3.xmlns:jaxws="/jaxws"4.xsi:schemaLocation="/jaxws http://cxf./schemas/jaxws.xsd /sch ema/beans /schema/beans/spring-b eans.xsd"5.default-autowire="byName"default-lazy-init="true">6.7.<jaxws:endpoint id="webServiceSample"8.address="/WebServiceSample"implementor=".coral.biz.examples.webservice.WebServiceSampleImpl"/>9.10.</beans>WebService 客户端 spring 配置文件 wsclient-context.xmlXml代码1.<beans xmlns="/schema/beans"2.xmlns:xsi="http://www.w/2001/XMLSchema-instance"3.xmlns:jaxws="/jaxws"4.xsi:schemaLocation="/jaxws http://cxf./schemas/jaxws.xsd /sch ema/beans /schema/beans/spring-b eans.xsd"5.default-autowire="byName"default-lazy-init="true">6.7. <!-- ws client -->8.<bean id="identityValidateServiceClient"class=".coral.admin.service.IdentityValidateService"9.factory-bean="identityValidateServiceClientFactory"factory-method="create"/>10.11. <bean id="identityValidateServiceClientFactory"12. class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">13. <property name="serviceClass"14. value=".coral.admin.service.IdentityValidateService"/>15. <property name="address"16. value="http://88.148.29.54:8080/coral/services/IdentityValidateService"/>17. </bean>18.19.</beans>6.发布到tomcat服务器以后通过以下地址即可查看自定义的webservice接口生成的wsdl:http://88.148.29.54:8080/aio/services/WebServiceSample?wsdl7.调用WebService接口的Junit单元测试程序Java代码1.package test.coral.sample;2.3.import org.springframework.test.AbstractDependencyInjectionSpringContextTests;4.5.import .examples.webservice.WebServiceSample;6.import erDTO;7.8.public class TestWebServiceSample extends9. AbstractDependencyInjectionSpringContextTests {10. WebServiceSample webServiceSampleClient;11.12. public void setWebServiceSampleClient(WebServiceSample webServiceSampleClient) {13. this.webServiceSampleClient = webServiceSampleClient;14. }15.16. @Override17. protected String[] getConfigLocations() {18. setAutowireMode(AUTOWIRE_BY_NAME);19. //spring 客户端配置文件保存位置20. return new String[] { "classpath:/cn/org/coral/biz/examples/webservice/wsclient-context.xml" };21. }22.23. public void testWSClinet(){24. Assert.hasText(webServiceSampleClient.say(" world"));25. }26.}。
CXF入门教程(5)--webService异步调用模式
CXF入门教程(5)--webService异步调用模式除了常见的同步调用模式,CXF还支持如下两种形式的异步调用模式:•轮询方法(Polling approach) - 这种情况下调用远程方法,我们可以调用一个特殊的方法;该方法没有输出参数,但是返回一个 javax.xml.ws.Response 实例。
可以轮询该 Response 对象(继承自 javax.util.concurrency.Future 接口)来检查是否有应答消息到达。
•回调方法(Callback approach) -这种情况下调用远程方法,我们调用另外一个特殊的方法:该方法使用一个回调对象(javax.xml.ws.AsyncHandler类型)的引用作为一个参数。
只要有应答消息到达客户端,CXF运行时就会回调该 AsyncHandler 对象,并将应答消息的内容传给它。
下面是两种异步调用的方法的描述和示例代码。
异步调用示例使用的契约下面展示的是异步调用示例中使用的WSDL契约,为保证教程的连续性,本文使用的是前面教程(1)中生成的HelloWorld服务的WSDL契约。
[html] view plaincopyprint?1.<?xml version="1.0" ?>2.<wsdl:definitions name="HelloWorld"3.targetNamespace="/"4.xmlns:ns1="/soap/http" xmlns:soap="/wsdl/soap/"5.xmlns:tns="/" xmlns:wsdl="/wsdl/"6.xmlns:xsd="/2001/XMLSchema">7.<wsdl:types>8.<xs:schema attributeFormDefault="unqualified"9.elementFormDefault="unqualified" targetNamespace="/ "10.xmlns:tns="/" xmlns:xs="/2001/XMLSchema">11.<xs:element name="IntegerUserMap" type="tns:Integ erUserMap"></xs:element>12.<xs:complexType name="User">13.<xs:sequence>14.<xs:element minOccurs="0" name="name" type="xs:s tring"></xs:element>15.</xs:sequence>16.</xs:complexType>17.<xs:complexType name="IntegerUserMap">18.<xs:sequence>19.<xs:element maxOccurs="unbounded" minOccurs="0 " name="entry"20.type="tns:IdentifiedUser"></xs:element>21.</xs:sequence>22.</xs:complexType>23.<xs:complexType name="IdentifiedUser">24.<xs:sequence>25.<xs:element name="id" type="xs:int"></xs:element>26.<xs:element minOccurs="0" name="user" type="tns:U ser"></xs:element>27.</xs:sequence>28.</xs:complexType>29.<xs:element name="sayHi" type="tns:sayHi"></xs:ele ment>30.<xs:complexType name="sayHi">31.<xs:sequence>32.<xs:element minOccurs="0" name="text" type="xs:str ing"></xs:element>33.</xs:sequence>34.</xs:complexType>35.<xs:element name="sayHiResponse" type="tns:sayHiR esponse"></xs:element>36.<xs:complexType name="sayHiResponse">37.<xs:sequence>38.<xs:element minOccurs="0" name="return" type="xs: string"></xs:element>39.</xs:sequence>40.</xs:complexType>41.<xs:element name="sayHiToUser" type="tns:sayHiToU ser"></xs:element>42.<xs:complexType name="sayHiToUser">43.<xs:sequence>44.<xs:element minOccurs="0" name="arg0" type="tns: User"></xs:element>45.</xs:sequence>46.</xs:complexType>47.<xs:element name="sayHiToUserResponse" type="tns: sayHiToUserResponse"></xs:element>48.<xs:complexType name="sayHiToUserResponse">49.<xs:sequence>50.<xs:element minOccurs="0" name="return" type="xs: string"></xs:element>51.</xs:sequence>52.</xs:complexType>53.<xs:element name="getUsers" type="tns:getUsers">< /xs:element>54.<xs:complexType name="getUsers">55.<xs:sequence></xs:sequence>56.</xs:complexType>57.<xs:element name="getUsersResponse" type="tns:get UsersResponse"></xs:element>58.<xs:complexType name="getUsersResponse">59.<xs:sequence>60.<xs:element minOccurs="0" name="return" type="tns :IntegerUserMap"></xs:element>61.</xs:sequence>62.</xs:complexType>63.</xs:schema>64.</wsdl:types>65.<wsdl:message name="getUsers">66.<wsdl:part element="tns:getUsers" name="parameter s">67.</wsdl:part>68.</wsdl:message>69.<wsdl:message name="sayHi">70.<wsdl:part element="tns:sayHi" name="parameters">71.</wsdl:part>72.</wsdl:message>73.<wsdl:message name="sayHiT oUser">74.<wsdl:part element="tns:sayHiT oUser" name="param eters">75.</wsdl:part>76.</wsdl:message>77.<wsdl:message name="sayHiT oUserResponse">78.<wsdl:part element="tns:sayHiT oUserResponse" name ="parameters">79.</wsdl:part>80.</wsdl:message>81.<wsdl:message name="sayHiResponse">82.<wsdl:part element="tns:sayHiResponse" name="para meters">83.</wsdl:part>84.</wsdl:message>85.<wsdl:message name="getUsersResponse">86.<wsdl:part element="tns:getUsersResponse" name=" parameters">87.</wsdl:part>88.</wsdl:message>89.<wsdl:portType name="iHelloWorld">90.<wsdl:operation name="sayHi">91.<wsdl:input message="tns:sayHi" name="sayHi">92.</wsdl:input>93.<wsdl:output message="tns:sayHiResponse" name="s ayHiResponse">94.</wsdl:output>95.</wsdl:operation>96.<wsdl:operation name="sayHiT oUser">97.<wsdl:input message="tns:sayHiToUser" name="sayHi ToUser">98.</wsdl:input>99.<wsdl:output message="tns:sayHiT oUserResponse" na me="sayHiT oUserResponse">100.</wsdl:output>101.</wsdl:operation>102.<wsdl:operation name="getUsers">103.<wsdl:input message="tns:getUsers" name="getUsers ">104.</wsdl:input>105.<wsdl:output message="tns:getUsersResponse" name ="getUsersResponse">106.</wsdl:output>107.</wsdl:operation>108.</wsdl:portType>109.<wsdl:binding name="HelloWorldSoapBinding" type= "tns:iHelloWorld">110.<soap:binding style="document"111.transport="/soap/http"></soap:binding>112.<wsdl:operation name="sayHi">113.<soap:operation soapAction="" style="document">< /soap:operation>114.<wsdl:input name="sayHi">115.<soap:body use="literal"></soap:body>116.</wsdl:input>117.<wsdl:output name="sayHiResponse">118.<soap:body use="literal"></soap:body>119.</wsdl:output>120.</wsdl:operation>121.<wsdl:operation name="sayHiT oUser">122.<soap:operation soapAction="" style="document">< /soap:operation>123.<wsdl:input name="sayHiToUser">124.<soap:body use="literal"></soap:body>125.</wsdl:input>126.<wsdl:output name="sayHiToUserResponse">127.<soap:body use="literal"></soap:body>128.</wsdl:output>129.</wsdl:operation>130.<wsdl:operation name="getUsers">131.<soap:operation soapAction="" style="document">< /soap:operation>132.<wsdl:input name="getUsers">133.<soap:body use="literal"></soap:body>134.</wsdl:input>135.<wsdl:output name="getUsersResponse">136.<soap:body use="literal"></soap:body>137.</wsdl:output>138.</wsdl:operation>139.</wsdl:binding>140.<wsdl:service name="HelloWorld">141.<wsdl:port binding="tns:HelloWorldSoapBinding" na me="HelloWorldImplPort">142.<soap:address location="http://localhost:9000/helloW orld"></soap:address>143.</wsdl:port>144.</wsdl:service>145.</wsdl:definitions>生成异步 stub 代码异步调用需要额外的stub代码(例如,服务端点接口中定义的专用的异步方法)。
用cxf生成webservice的java客户端代码
⽤cxf⽣成webservice的java客户端代码
百度来的:
最近,由于要⽤到某公司提供的webservice实现的api接⼝,想到了⽤cxf的wsdl2java⼯具来⽣成客户端程序。
(⾃⼰写是⽐较⿇烦且费时,so偷懒⼀下、、)
使⽤步骤如下:
⼀、下载apache cxf的包,如apache-cxf-2.7.10.zip,地址:/download.html
⼆、解压apache-cxf-2.7.10.zip⾄某⼀⽬录,如D:\apache-cxf-2.7.10
三、设置环境变量
1、CXF_HOME=D:\apache-cxf-2.7.10
2、在path后⾯加上 %CXF_HOME%/bin;
在cmd命令中输⼊wsdl2java,如果有提⽰usage,就表明配置成功
四、运⾏wsdl2java⼯具
附wsdl2java⽤法:
wsdl2java -p com -d D:\\src -all xx.wsdl
-p 指定其wsdl的命名空间,也就是要⽣成代码的包名:
-d 指定要产⽣代码所在⽬录
-client ⽣成客户端测试web service的代码
-server ⽣成服务器启动web service的代码
-impl ⽣成web service的实现代码
-ant ⽣成build.xml⽂件
-all ⽣成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.。
基于CXF实现Web Service开发
ESB基于 CXF 实现 Web Service 开发项目:企业服务总线 ESB 编写:华腾 ESB 项目组ESB文档版本 版本号 修改日期 1.0 2009-10-14 1.1 2010-01-12编写 林荣坤 田坤评审批准修改内容 初稿 修正ESB目录基于 CXF 实现 Web Service 开发..................................................................................................... 1 1 简介........................................................................................................................................... 4 1.1 CXF 功能特性 .......................................................................................................... 4 1.2 CXF 项目目标 .......................................................................................................... 4 2 开发环境需求及工具安装 ....................................................................................................... 6 2.1 CXF 安装包 ............................................................................................................. 6 2.1.1 下载及目录结构 ............................................................................................... 6 2.1.2 CXF 框架支撑环境 ........................................................................................... 9 2.1.3 JDK 版本选择、下载和安装 ......................................................................... 10 2.1.4 Servlet 容器下载和安装................................................................................ 10 3 CXF 环境配置及示例运行...................................................................................................... 10 4 SOAP OVER JMS 开发 ............................................................................................................ 12 4.1 文本 JNDI 配置 ...................................................................................................... 12 4.2 服务契约优先 ......................................................................................................... 12 4.3 命令行方式生成服务端 ......................................................................................... 12 4.4 命令行方式生成客户端 ......................................................................................... 14 4.5 测试......................................................................................................................... 15 5 集成 Sping ............................................................................................................................... 15 5.1 服务契约修改 ......................................................................................................... 15 5.2 代码生成................................................................................................................. 16 5.3 Spring 配置 ............................................................................................................. 16 5.3.1 服务端配置 ..................................................................................................... 16 5.3.2 客户端配置 ..................................................................................................... 18 5.4 其他设置................................................................................................................. 20 5.4.1 配置拦截器 ..................................................................................................... 20 5.4.2 配置特征 ......................................................................................................... 21 5.4.3 配置编码 ......................................................................................................... 21 5.5 Sping 加载方式 ...................................................................................................... 21 5.5.1 独立加载 ......................................................................................................... 21 5.5.2 容器加载 ......................................................................................................... 21 5.6 测试......................................................................................................................... 22 6 集成 WebSphere Application Server v6.1 ........................................................................... 23 6.1 删除 Servlet 和 HTTP 服务器相关包.................................................................... 23 6.2 修改 WEB 模块类加载方式 .................................................................................. 23ESB1 简介本文档介绍定义好服务 WSDL、schema 文件后,通过 WSDL First 的方式,基于 CXF 的 JAX-WS 实现 Web Service 开发。
cxf调用webservice服务时传递服务器验证需要的用户名密码
cxf调⽤webservice服务时传递服务器验证需要的⽤户名密码cxf通过wsdl2java⽣成客户端调⽤webservice时,如果服务器端需要通过⽤户名和密码验证,则客户端必须传递验证所必须的⽤户名和密码,刚开始想通过url传递⽤户名和密码,于是在wsdl⽂件中直接在<soap:address location 标记中添加加⼊⽤户名和密码,但是webservice 接收不到参数,此种⽅法⾏不通。
后来在接⼝⽅法调⽤前⽤BindingProvider 得到RequestContext,在其中设置了请求需要的⽤户名和密码,接⼝顺利通过验证,执⾏成功,具体代码如下:/*** 根据给定的参数执⾏接⼝程序** @param request* @return*/public ZPILOT01SSOCMMIF001CONResponse executeService(ZPILOT01SSOCMMIF001CON request) throws Exception {// 得到本地服务类MIZPILOT01SSOCMMIF001CONOutSynService service = new MIZPILOT01SSOCMMIF001CONOutSynService();// 得到接⼝的代理MIZPILOT01SSOCMMIF001CONOutSyn stub = service.getMIZPILOT01SSOCMMIF001CONOutSynPort();// 设置访问接⼝服务器的⽤户名和密码BindingProvider bp = (BindingProvider) stub;Map<String, Object> context = bp.getRequestContext();context.put(ERNAME_PROPERTY, XI_USER_NAME);context.put(BindingProvider.PASSWORD_PROPERTY, XI_PASSWORD);// 执⾏接⼝ZPILOT01SSOCMMIF001CONResponse response = stub.miZPILOT01SSOCMMIF001CONOutSyn(request);// 返回响应return response;}。
CXF框架实现Webservice服务
CXF框架实现Webservice服务——于2015年02月05日Apache CXF是一种基于Servlet技术的SOA应用开发框架。
CXF 继承了Celtix 和XFire 两大开源项目的精华,提供了对多种Web Services 标准的支持,包含SOAP、Basic Profile、WS-Addressing等。
CXF允许根据实际项目的需要,采用代码优先(Code First)或者WSDL 优先(WSDL First)来实现Web Services应用的发布和使用。
一、SOA架构与Webservice1.1 SOA架构的产生SOA(Service-oriented architecture) 面向服务的体系结构,是构造分布式系统应用程序的方法。
它将应用程序功能作为服务发送给最终用户或者其他服务,采用开放标准、与软件资源进行交互并采用表示的标准方式。
SOA架构思想的产生源于两个方面:需求拉动和技术推动。
(1) 需求拉动需求拉动方面,主要来自于两种信息化的困境。
一个是“信息孤岛”造成基于系统之间互联互通的整合需求;另一个是业务的变化所导致对IT灵活性,以适应变化的需求。
企业在不同的时期和不同的厂商合作,建立了不同的应用系统,而系统之间彼此互不关联。
因此导致企业内部各个系统成为一个“信息孤岛”,造成信息不一致。
同时,系统的互联互通不仅包含一个企业内部,也包括集团和各个分公司系统之间的互通。
另一方面,由于行业竞争的日益激烈,企业需要不断地调整自身的业务流程,而僵化的IT基础设施跟不上这种不断加快的变化。
传统的信息化方法和软件研究方法是对业务需求的直接映射,这种“需求驱动”的信息系统最大的缺陷就是对变化的适应性差,因此需要一种按照架构驱动,对业务进行适当的抽象,通过服务的表达和业务过程的原子化,来满足系统是按照企业架构来构造,这种架构是动态重构技术来支撑的,这种架构就是SOA。
(2) 技术推动造成系统之间不能互联互通的一个重要原因,就是系统的异构性。
利用CXF框架开发webservice接口
写Web Service的接口
• 书写一个Web Service的接口类
写Web Service的实现
Web Service服务和使用
• Web Service服务者 • Web Service使用者
使用 Web 服务的原理
发布的 WebService
WSDL
▪Client程序(Java、 .NET)
面向服务的体系架构
• 一个组件模型
• 将应用程序的不同功能单元(服务)
通过这些服务之间定义良好的接口和 契约联系起来。
Web Service体系结构
服务提供商发布绑定Fra bibliotek服务代理商
服务注册表
查找
服务请求者
Web Service工作原理
此处的双向虚线表示一次性通信
获取类型信息(XML 模 式)
客户端 端应用程序
参数
基于 HTTP 的 SOAP 协议 XML
返回值
服务描述文件
存放 Web 服务的 Web 服务器
总结
• Web Service是一个应用程序,它能通过网络,特别是互联 网来描述、发布、定位及调用的服务
• Web Service体系结构包含三种角色:服务提供商、服务代 理商和服务请求者。这些角色之间有相互存在着一些操作 ,它们分别是:发布、查找和绑定
• Web Service 是基于XML的。它在Internet上一般使用SOAP 进行传输
• UDDI用于维护存储服务提供商及其服务信息的注册表 • WSDL是用来描述Web Service 的,客户端程序经常通过
springboot-实现WebService(CXF实现)的拦截器(Interceptor)
springboot-实现WebService(CXF实现)的拦截器(Interceptor)拦截器(Interceptor)是CXF功能最主要的扩展点,可以在不对核心模块进行修改的情况下,动态添加很多功能。
拦截器和JAX-WS Handler、Filter的功能类似,当服务被调用时,就会创建一个拦截器链(Interceptor Chain),拦截器链在服务输入(IN)或输出(OUT)阶段实现附加功能。
拦截器可以在客户端,也可以在服务端添加。
当客户端发起一个WebService请求时,在客户端会创建输出拦截器链(outinterceptor),服务端接收到客户端的后,会创建输入拦截器链(ininterceptor)。
当服务端返回响应消息时,响应消息会经过服务端的输出拦截链,客户端接收到服务端的响应时,会创建输入拦截器链,响应消息先经过输入拦截器链处理。
拦截器在服务端和客户端的作用如图所示。
注:上图来源于网络。
下面,我们以一个Header认证为例,来演示CXF的拦截器的使用。
1、客户端拦截器[java] view plain copy1.public class ClientAuthorInterceptor extends AbstractPhaseInterceptor<SoapMessage> {2.3./**4.* 客户端申请的token信息5.*/6.private String token;7.8.public ClientAuthorInterceptor(String token) {9.// 设置拦截器的时机,在发送请求到服务端之前进行拦截10.super(Phase.PREPARE_SEND);11.this.token = token;12.}13.14.@Override15.public void handleMessage(SoapMessage soap) throw s Fault {16.// 在soap消息中添加认证头信息17.List<Header> headers = soap.getHeaders();18.Document doc = DOMUtils.createDocument();19.Element auth = doc.createElement(AuthorHeader.HEA DER_NAME);20.Element token = doc.createElement(AuthorHeader.HE ADER_TOKEN);21.token.setTextContent(this.token);22.auth.appendChild(token);23.Header header = new SoapHeader(new QName(Auth orHeader.HEADER_NAME), auth);24.headers.add(header);25.}26.}注意:客户端是outinterceptor2、服务端拦截器下面,服务端对发送的消息进行拦截,并做认证[java] view plain copy1.@Slf4j2.@Component3.public class AuthInterceptor extends AbstractPhaseInterc eptor<SoapMessage> {4.5.@Autowired6.private AuthorizationRepository repository;7.8.public AuthInterceptor() {9.super(ER_LOGICAL);10.}11.12.@Override13.public void handleMessage(SoapMessage message) t hrows Fault {14.Header header = message.getHeader(new QName("a uthrity"));15.if(null == header){16.log.warn("token没有认证通过!原因为:客户端请求中不存在认证的Header");17.throw new Fault(new AuthenticationException("token 没有认证通过!原因为:客户端请求中不存在认证的Header"));18.}19.Element ele = (Element) header.getObject();20.if(null == ele){21.log.warn("token没有认证通过!原因为:客户端请求中认证的Header无认证信息");22.throw new Fault(new AuthenticationException("token 没有认证通过!原因为:客户端请求中认证的Header无认证信息"));23.}24.Node node = ele.getFirstChild();25.if(null == node){26.log.warn("token没有认证通过!原因为:客户端请求中认证的Header无认证信息");27.throw new Fault(new AuthenticationException("token 没有认证通过!原因为:客户端请求中认证的Header无认证信息"));28.}29.String token = node.getTextContent();30.if(null == token || token.isEmpty()){31.log.warn("token没有认证通过!原因为:客户端请求中认证的Header无token信息");32.throw new Fault(new AuthenticationException("token 没有认证通过!原因为:客户端请求中认证的Header无token信息"));33.}34.Authorization auth = repository.findByToken(token);35.if(null == auth){36.log.warn("token没有认证通过!原因为:客户端请求中认证的token信息无效,请查看申请流程中的正确token信息");37.throw new Fault(new AuthenticationException("token 没有认证通过!原因为:客户端请求中认证的token信息无效,请查看申请流程中的正确token信息,流程申请地址:http://127.0.0.1:8080/email"));38.}("客户端认证成功,token有效!");40.}41.}注:服务端为ininterceptor编写拦截器很简单,只需继承AbstractPhaseInterceptor类并实现handleMessage即可。
WebService案例Springboot+CXF开发WebServiceDemo
WebService案例Springboot+CXF开发WebServiceDemo ⼀、本次开发除了⽤到spring boot基础jar包外,还⽤到了cxf相关jar包:1 <!-- cxf⽀持 -->2 <dependency>3 <groupId>org.apache.cxf</groupId>4 <artifactId>cxf-rt-frontend-jaxws</artifactId>5 <version>3.1.6</version>6 </dependency>7 <dependency>8 <groupId>org.apache.cxf</groupId>9 <artifactId>cxf-rt-transports-http</artifactId>10 <version>3.1.6</version>11 </dependency>⼆、⾸先我们创建⼀个实体类,内容是关于⽤户信息的查询和记录:1 import java.io.Serializable;2 import java.util.Date;34 public class User implements Serializable {56 private static final long serialVersionUID = -5939599230753662529L;7 private String userId;8 private String username;9 private String age;10 private Date updateTime;11 //getter setter ......12 public void setUserId(String userId) {13 erId=userId;14 }15 public void setUsername(String username) {16 ername=username;17 }18 public void setAge(String age) {19 this.age=age;20 }21 public void setUpdateTime(Date updateTime) {22 this.updateTime=updateTime;23 }242526 public String getUserId() {27 return userId;28 }29 public String getUserName() {30 return username;31 }32 public String getAge() {33 return age;34 }35 public Date getUpdateTime() {36 return updateTime;37 }38 }三、接下来我们创建接⼝类:1 import javax.jws.WebMethod;2 import javax.jws.WebParam;3 import javax.jws.WebService;45 import er;678 @WebService9 public interface UserService {1011 @WebMethod12 String getName(@WebParam(name = "userId") String userId);13 @WebMethod14 User getUser(String userId);15 }四、有了接⼝类,那么接下来我们对接⼝进⾏实现,也就是接⼝实现类(也就是业务类)代码:1 package cn.paybay.demo.service.impl;23 import java.util.Date;4 import java.util.HashMap;5 import java.util.Map;6789 import javax.jws.WebService;1011 import er;12 import erService;1314 @WebService(targetNamespace="/",endpointInterface = "erService")15 public class UserServiceImpl implements UserService{1617 private Map<String, User> userMap = new HashMap<String, User>();18 public UserServiceImpl() {19 System.out.println("向实体类插⼊数据");20 User user = new User();21 user.setUserId("411001");22 user.setUsername("zhansan");23 user.setAge("20");24 user.setUpdateTime(new Date());25 userMap.put(user.getUserId(), user);2627 user = new User();28 user.setUserId("411002");29 user.setUsername("lisi");30 user.setAge("30");31 user.setUpdateTime(new Date());32 userMap.put(user.getUserId(), user);3334 user = new User();35 user.setUserId("411003");36 user.setUsername("wangwu");37 user.setAge("40");38 user.setUpdateTime(new Date());39 userMap.put(user.getUserId(), user);40 }41 @Override42 public String getName(String userId) {43 return "liyd-" + userId;44 }45 @Override46 public User getUser(String userId) {47 System.out.println("userMap是:"+userMap);48 return userMap.get(userId);49 }5051 }注释(PS):在发布服务之前,我们要在这⾥对业务实现类进⾏⼀下说明,请⼤家看下图箭头指向的⽅框部分(图⼀)下⾯我来解释⼀下加上图⽅框箭头所指代码的⽬的:/:这是我的业务类所在路径;/:这是我的接⼝类所在路径;在不加上图⽅框箭头所指代码的情况下,你最后发服务的结果是这样的(如下图):(图⼆)并且会在你进⾏客户端调⽤的时候回报错:No operation was found with the name {/}getUser.那么原因就是:在CXF发布服务的时候,发布的是业务类(UserServiceImpl.java),那么默认的命名空间就会是业务类所在包(路径),⽽对外界暴露的则是接⼝类(UserService.java),那么对于客户端调⽤的时侯,需要按照接⼝类所在路径进⾏命名空所以在发布之前我们要在业务类(UserServiceImpl.java)上增加注解,指定命名空间,然后再进⾏发布,那么我们最终在加上(图⼀)⽅框箭头所指代码情况下,发布服务的结果为下图(请看图三):(图三)五、(发布服务)接⼝类,业务类代码都已经准备好,那么我接下来我就要对webservice服务进⾏发布:代码如下:1 23 import javax.xml.ws.Endpoint;45 import org.apache.cxf.Bus;6 import org.apache.cxf.bus.spring.SpringBus;7 import org.apache.cxf.jaxws.EndpointImpl;8 import org.apache.cxf.transport.servlet.CXFServlet;9 import org.springframework.boot.web.servlet.ServletRegistrationBean;10 import org.springframework.context.annotation.Bean;11 import org.springframework.context.annotation.Configuration;1213 import erService;14 import erServiceImpl;151617 @Configuration18 public class TestConfig {1920 @Bean21 public ServletRegistrationBean dispatcherServlet() {22 return new ServletRegistrationBean(new CXFServlet(), "/test/*");23 }24 @Bean(name = Bus.DEFAULT_BUS_ID)25 public SpringBus springBus() {26 return new SpringBus();27 }28 @Bean29 public UserService userService() {30 return new UserServiceImpl();31 }32 @Bean33 public Endpoint endpoint() {34 EndpointImpl endpoint = new EndpointImpl(springBus(), userService());35 endpoint.publish("/user");36 return endpoint;37 }3839 }那么到这⾥呢,我们的所有的步骤基本完成了,启动spring boot 然后再浏览器中输⼊url:http://localhost:8080/webservice/test/user?wsdl可以看到有相关的wsdl描述信息输出了,说明服务已经发布了。
cxf WebService设置wsdl中soapAction的值
cxf WebService设置wsdl中soapAction的值用cxf开发一个WebService很简单,只需要下面几步:1.定义接口public interface HelloService {String hello();}2.实现public class HelloServiceImpl implements HelloService {@Overridepublic String hello() {return "hi,my name is gyoung ";}}3.用ServerFactoryBean生成服务复制代码public static void main(String[] args) {HelloServiceImpl helloworldImpl = new HelloServiceImpl();//cxf发布服务的工厂beanServerFactoryBean svrFactory = new ServerFactoryBean();//设置服务类svrFactory.setServiceClass(HelloService.class);//设置服务地址svrFactory.setAddress("http://localhost:9001/Hello");//设置服务beansvrFactory.setServiceBean(helloworldImpl);svrFactory.create();}复制代码这样,一个简单的HelloWorld服务便生成成功了。
但是,这样生成的服务有一个问题,wsdl中的soapAction属性是空的复制代码<wsdl:binding name="HelloServiceSoapBinding" type="tns:HelloServicePortType"><soap:binding style="document" transport="/soap/http"/> <wsdl:operation name="hello"><soap:operation soapAction="" style="document"/><wsdl:input name="hello"><soap:body use="literal"/></wsdl:input><wsdl:output name="helloResponse"><soap:body use="literal"/></wsdl:output></wsdl:operation></wsdl:binding>复制代码这一段<soap:operation soapAction="" style="document"/>,如果是.net生成的服务,soapAction是有值的复制代码<wsdl:binding name="WebService1Soap" type="tns:WebService1Soap"><soap:binding transport="/soap/http"/><wsdl:operation name="HelloWorld"><soap:operation soapAction="/HelloWorld" style="document"/><wsdl:input><soap:body use="literal"/></wsdl:input><wsdl:output><soap:body use="literal"/></wsdl:output></wsdl:operation></wsdl:binding>复制代码查看了很久的源码,才发现,设置cxf设置soapAction是在org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean类中它会去循环遍历serviceConfigurations,调用其getAction方法来获取action的值。
通过CXF开发webService接口(soap协议、maven项目)
1. 引入cxf的jar包pom文件里面直接增加依赖< dependency><groupId > junit</ groupId><artifactId > junit</ artifactId><version >4.11 </version ><scope >test </scope ></dependency ><dependency ><groupId >org.springframework </groupId ><artifactId >spring- webmvc</ artifactId><version >4.0.0.RELEASE </version ></dependency ><dependency ><groupId >org.apache.cxf </groupId ><artifactId > apache-cxf </artifactId ><version >2.4.3</version ><type > pom</ type></dependency >2. 配置web.xml文件<? xml version= "1.0" encoding= "UTF-8" ?>< web-app xmlns= "/xml/ns/javaee"xmlns:xsi= "/2001/XMLSchema-instance" xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_3_1.xsd" version= "3.1" >< display-name >Archetype Created Web Application</display-name >< context-param ><param-name >contextConfigLocation</param-name ><param-value >classpath:config/spring/metadata WebService-spring.xml </param-value ></context-param ><listener ><listener-class >org.springframework.web.conte xt.ContextLoaderListener </listener-class ></listener ><servlet ><servlet-name >CXFServlet </servlet-name ><servlet-class >org.apache.cxf.transport.servl et.CXFServlet </servlet-class ></servlet ><servlet-mapping ><servlet-name >CXFServlet </servlet-name ><url-pattern >/services/* </url-pattern ></servlet-mapping ><filter ><filter-name >encodingFilter </filter-name >< filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class ><init-param ><param-name >encoding </param-name ><param-value >UTF-8 </param-value ></init-param ><init-param ><param-name >forceEncoding </param-name ><param-value >true </param-value ></init-param ></filter ><filter-mapping ><filter-name >encodingFilter </filter-name ><url-pattern >/* </url-pattern ></filter-mapping ></ web-app>3. 配置cxf.xml文件<? xml version= "1.0" encoding= "UTF-8" ?>< beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance" xmlns:jaxws= "/jaxws"xmlns:context="/schema/context"xmlns:jaxrs= "/jaxrs"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/jaxws/schemas/jaxws.xsd/schema/context/schema/context/spr ing-context.xsd/jaxrs/schemas/jaxrs.xsd" ><!-- simpleWebService.xml配置文件 start --><import resource = "classpath:META-INF/cxf/cxf.xml" /> <!-- <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> --><import resource ="classpath:META-INF/cxf/cxf-servlet.xml" /><context:annotation-config /><!-- SOAP 服务开放 --><bean id = "wSS4JInInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor" ><constructor-arg ><!--<map ><entry key = "action" value= "UsernameToken" /><entry key = "passwordType" value= "PasswordText" /><entry key = "user" value= "cxfServer" /><entry key = "passwordCallbackRef" value= "ss" /></map >--></constructor-arg ></bean ><bean id = "jaxWsServerFactoryBean" class="org.apache.cxf.jaxws.JaxWsServerFactoryBean"scope= "prototype" ><property name = "inInterceptors"><list ><!-- <ref bean = "wSS4JInInterceptor" /> --></list ></property ></bean ><bean id = "jaxWsWebServicePublisherBeanPostProcessor"class="org.apache.cxf.jaxws.spring.JaxWsWebServicePublisherBean PostProcessor" ><property name = "urlPrefix" value= "/" /><property name = "prototypeServerFactoryBeanName" value= "jaxWsServerFactoryBean" /></bean ><!-- simpleWebService.xml配置文件 end--><!-- 导入soap协议的服务支持 serviceClass为对应的webService接口类-->< jaxws:server id= "ResumeUpload" serviceClass= "com.sigmatrix.soap.webService.DemoService"address= "/ResumeUpload" ><!-- 添加webService接口实现类 --><jaxws:serviceBean ><ref bean = "demoServiceImpl" /></jaxws:serviceBean ><!-- 添加协议使用MTOM附件--><jaxws:properties ><entry key = "mtom-enabled" value= "true" /></jaxws:properties ></jaxws:server ></ beans>4. 要开放的接口加上cxf服务的注解接口类:@WebService (portName ="inbound.webServices.ticket.saServiceSoap12" )@javax.xml.ws.soap. MTOMpublic interface DemoService {@WebMethodpublic String demo( @WebParam(name = "demo") Demo demo);}接口实现类:@Component@WebService (portName ="inbound.webServices.ticket.saServiceSoap12" )@BindingType (value ="/2003/05/soap/bindings/HTTP/" )public class DemoServiceImpl implements DemoService { public String Demo(Demo demo) {String userName = demo.getUserName();String password= demo.getPassword();return "success";}Demo实体类:public Class Demo() {public String userName;public String password;public String getUserName() {return userName;}public void setUserName(String userName) {erName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password= password;}}5. 部署到tomcat启动即可,测试访问 ip:端口号//项目名称/services/。
CXF使用教程(二)——webService自动生成客户端代码
CXF使⽤教程(⼆)——webService⾃动⽣成客户端代码webService⾃动⽣成客户端代码有四种⽅法:⼀:使⽤Axis⽣产客户端代码(另存为bat⽂件)需要注意的是:⽬录包含空格,⽐如Axis_Lib,Output_Pathset Axis_Lib=F:\axis1.4\axis\WEB-INF\libset Java_Cmd=java -Djava.ext.dirs=%Axis_Lib%set Output_Path=D:\Workspacesset Package=com.axis.sub%Java_Cmd% org.apache.axis.wsdl.WSDL2Java -o%Output_Path% -p%Package% http://192.168.11.62:8090/rainLogin?wsdl pause⼆:使⽤JDK1.6的wsimport.exe(在jdk的bin⽬录下)产⽣客户端代码(之前要将JDK的bin添加到环境变量Path中)wsimport -keep -p com.jdk6.sub -s JavaSrc http://192.168.11.62:8090/rainLogin?wsdl1. -s(src):在当前路径下的JavaSrc(要⼿动创建)⽂件夹中⽣成客户端代码2. -p(package):定义客户端代码的包名3. -keep 保留.class⽂件三:使⽤CXF wsdl2java.bat (要先将CXF的bin⽬录添加到环境变量Path下)在cmd本项⽬SCR⽬录下运⾏下⾯代码,就会在src下⽣成客户端代码wsdl2java http://192.168.11.62:8080/FFWebservice/services/PortalServices?wsdl四:使⽤Myeclipse⾃带⼯具⽣成客户端代码finnish 就可以⽣成客户端代码了。
个⼈⼀般⽐较喜欢⽤第⼆种⽅法。
CXF WebService开发常见异常及解决方法
最近在研究利用CXF开发WebService,一开始就遇到了不少的问题,现将开发中记录下来的问题和解决方法分享给大家。
===============================异常1================================org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass信息: Creating Service {/}IHelloServicesService from class com.deppon.ws.services.IHelloServicesException in thread "main" javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found at javax.xml.parsers.DocumentBuilderFactory.newInstance(Unknown Source)atorg.apache.cxf.helpers.XMLUtils.getDocumentBuilderFactory(XMLUtils.ja va:109)at org.apache.cxf.helpers.XMLUtils.getParser(XMLUtils.java:133)at org.apache.cxf.helpers.XMLUtils.parse(XMLUtils.java:151)at …异常原因:缺少xercesImpl.jar。
===============================异常2================================org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromClass信息: Creating Service {/}IHelloServicesService from class com.deppon.ws.services.IHelloServicesException in thread "main" ng.LinkageError: JAXB 2.1 API is being loaded from the bootstrap classloader, but this RI (from jar:file:/d:/ workspace/CxfServices/libs/jaxb-impl-2.2.1.1.jar!/com/sun/xml/bind/v2 /model/impl/ModelBuilder.class) needs 2.2 API. Use the endorsed directory mechanism to place jaxb-api.jar in the bootstrap classloader. (See /j2se/1.6.0/docs/guide/standards/)atcom.sun.xml.bind.v2.model.impl.ModelBuilder.<clinit>(ModelBuilder.jav a:173)atcom.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContex tImpl.java:456)atcom.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.ja va:302)at …原因:jdk1.6.0_11中的jaxws-api-2.0.jar及jaxb-api-2.0.jar,而cxf需要jaxws-api-2.1.jar及jaxb-api-2.1.jar的支持。
cxf开发webservice
用cxf开发webserviceApache CXF是一个开源的Service框架,它实现了JCP与Web Service中一些重要标准。
CXF简化了构造,集成,面向服务架构(SOA)业务组件与技术的灵活复用。
在CXF中,Service使用WSDL标准定义并能够使用各种不同的消息格式(或binding)和网络协议(transports)包括SOAP、XML(通过HTTP 或JMS)进行访问。
CXF同样支持多种model 如:JAX-WS,JBI,SCA和CORBA service。
CXF设计成可灵活部署到各种容器中包括Spring-based,JBI,SCA,Servlet和J2EE容器。
1.准备工作cxf是apache的一个正式的开源项目,目前已经更新到2.6.2版本,从下面的地址可以下载最新的版本。
/这里我用2.6.1的版本就行讲解。
需要的jar包有:cxf-2.6.1.jarcxf-manifest.jarcxf-services-sts-core-2.6.1.jarcxf-services-wsn-api-2.6.1.jarcxf-services-wsn-core-2.6.1.jarcxf-xjc-boolean-2.6.0.jarcxf-xjc-bug671-2.6.0.jarcxf-xjc-dv-2.6.0.jarcxf-xjc-runtime-2.6.0.jarcxf-xjc-ts-2.6.0.jar2.服务端配置与开发2.1.web.xml配置在<context-param>里边要加上lasspath*:applicationContext-cxf.xml一项的值:<context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:applicationContext.xml,classpath*:applicationContext-cxf.xml,classpath*:applicationContext-beans.xml,classpath*:applicationContext-service.xml,classpath*:applicationContext-beans-*.xml,classpath*:applicationContext-service-*.xml</param-value></context-param>同时还要在下面加上如下的servlet配置:<servlet><servlet-name>CXFServlet</servlet-name><display-name>CXF Servlet</display-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>CXFServlet</servlet-name><url-pattern>/service/*</url-pattern></servlet-mapping>2.2.applicationContext-cxf.xml文件配置在src目录下创建一个applicationContext-cxf.xml文件,里边的内容如下:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:context="/schema/context"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/context/schema/context/spring-context-3.1.xsd"><import resource="classpath:META-INF/cxf/cxf.xml" /><import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /><import resource="classpath:META-INF/cxf/cxf-servlet.xml" /><context:component-scan base-package="pare.webservice" /><bean id="webServicesAgent"class="org.apache.cxf.spring.remoting.Jsr181HandlerMapping"><property name="urlPrefix"><value>/</value></property></bean></beans>其中<context:component-scan base-package="com.webservice.cxf" />是配置存放webservice服务的java文件的包路径。
CXFWebService开发指南、技术文档
CXFWebService开发指南、技术文档CXF WebService上次介绍了Axis的WebService,现在我们来看看CXF是怎么完成WebService的。
Axis1 WebService 在线博文:Axis2 WebService 在线博文:一、准备工作1、 CXF官方网址:2、 Jar包下载地址:将下来的jar包解压后,目录大概就这样bin目录提供的是常用的dos控制台命令工具docs 帮助文档lib jar包、依赖库lib-samples 也是jar包,有jetty、httpclients、junit等jar包modules 打包好的WebService模块samples示例demo3、源码下载:有时候你可以看看源码,对你了解和学习CXF WebService都会有作用。
4、 CXF的特性有代码生成工具:Java to WSDL;WSDL to Java;XSD to WSDL;WSDL to XML;WSDL to SOAP;WSDL to Service;支持 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;、JavaScript、通过 Yoko 支持 CORBA;通过 Tuscany 支持 SCA;通过 ServiceMix 支持 JBI内置Jetty应用服务器二、 CXF 入门实例又一HelloWorld示例,老套的HelloWorld是入门经典。
也是基础和必须掌握的,下面看看HelloWorldWebService,很简单。
需要的jar包如下:1、 HelloWorldService服务器端代码package com.hoo.service;import javax.jws.WebParam;import javax.jws.WebService;import javax.jws.soap.SOAPBinding;import javax.jws.soap.SOAPBinding.Style;/*** <b>function:</b>CXF WebService 服务器端helloWorld示例* @author hoojo* @createDate 2011-3-16 上午08:29:07* @file HelloWorld.java* @package com.hoo.service* @project CXFWebService* @blog /IBM_hoojo*@******************** @version 1.0*/@WebService@SOAPBinding(style = Style.RPC)public class HelloWorldService {} public String sayHello(@WebParam(name = "name") String name) { } return name + " say: Hello World ";要说明的是,上面的服务器端代码运用了JDK5的新特性Annotation,这个非常好用。
CXF框架webservice教程
CXF框架实现webservice教程1 使用CXF实现一个简单的WEB SERVICE首先介绍如何用CXF实现一个基本的hello world首先到apache官网去下载CXF的开发jar包//cxf/2.4.3/apache-cxf-2.4.3.zip创建cxf webservice服务器端普通java项目,叫做HelloCxfServer,把必须用到的jar文件通过构建路径引入,为了省事,可以直接把所有的jar引入此处注意:如果是jdk1.6启动服务器会发生如下错误JAXB 2.1 API is being loaded from the bootstrap classloader, but this RI (from jar:file:/E:/javaLib/cxf_all_jar/jaxb-impl-2.2.1.1.jar!/com/sun/xml/bind/v2/model/impl/ModelBuilder.class) needs 2.2 API. Use the endorsed directory mechanism to place jaxb-api.jar in the bootstrap classloader.这是由于jdk1.6的jar包和cxf的jar包冲突造成的,需要把cxf lib中的endorsed目录拷入到D:\Program Files\Java\jdk1.6.0\jre\lib目录下创建一个接口HelloWorld和一个实现类HelloWorldImpl,只提供一个成员方法,叫做sayHello,给接口和实现类添加注解@WebService,这是最基本的注解/test/HellWorld.java源码package test;import javax.jws.WebService;@WebServicepublic interface HelloWorld {String sayHello(String name);}/test/HelloWorldImpl.java源码package test;import javax.jws.WebService;@WebServicepublic class HelloWorldImpl implements HelloWorld {@Overridepublic String sayHello(String name) {System.out.println("sayHello方法被调用...");return"hello," + name;}}CXF自带了一个Web Service容器Jetty,这是一个WEB容器,类似于tomcat,能够直接发布web service,下面创建一个发布服务类MainServer,执行这个类就会运行服务器,看到控制台输出日志信息,表示启动服务成功/test/MainServier.java源码package test;import org.apache.cxf.endpoint.Server;import org.apache.cxf.jaxws.JaxWsServerFactoryBean;public class MainServer {public static void main(String[] args) {//创建一个JaxWs服务器工厂JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();//设置发布类factory.setServiceClass(HelloWorldImpl.class);//设置服务发布的地址factory.setAddress("http://localhost:6666/MyCxfService");//根据设置创建一个服务器Server server = factory.create();//启动服务器server.start();}}发布成功以后,可以通过浏览器去查看生成的WSDL,在浏览器地址栏输入http://localhost:6666/MyCxfService?wsdl,效果如下:下面创建访问WebService的客户端,可以重新创建一个项目,也可以就在这个项目里实现,我下面在同一个项目中创建一个类HelloWorldCient/test/HelloWorldClient.java源码package test;import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;import org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean;public class HelloWorldClient {public static void main(String[] args) {//创建一个JaxWs的代理工厂JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();//设置访问地址factory.setAddress("http://localhost:6666/MyCxfService");//设置接口类型factory.setServiceClass(HelloWorld.class);//获得代理类实例HelloWorld helloWorld = (HelloWorld) factory.create();//调用方法String str = helloWorld.sayHello("张三");System.out.println(str);}}运行客户端,会看到控制台,输出:hello,张三2 WSDL结构分析主要通过上一章生成的WSDL,来对WSDL语言的标签进行解释Web Services Description Language的缩写,是一个用来描述Web服务和说明如何与Web服务通信的XML 语言。
Java通过cxf发布和调用webservices接口
Java通过cxf发布webservices接口第一步:创建一个工程如:cxfserver1注:web工程和java工程都可以第二步:把apache-cxf-2.6.1资源包中lib文件夹下所有的jar包共计75个,都拷贝到cxfserver1的lib目录下,如果你的工程师java工程自己创建一个lib文件夹第三步:创建一个包inter,在inter下创建一个发布接口,接口名HelloWorld ,并进行webservices注解package inter;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebService;/*** 发布接口* @author Administrator**/@WebServicepublic interface HelloWorld {@WebMethodpublic String sayHello(@WebParam(name="name")String name);}第四步:创建一个包impl,在impl下创建一个接口实现类,对接口中的方法进行功能实现package impl;import inter.HelloWorld;/*** 接口功能实现类* @author Administrator**/public class HelloWorldImpl implements HelloWorld {public String sayHello(String name) {// TODO Auto-generated method stubSystem.out.println("进入接口中");return name.concat(",进入接口中");}}第五步:创建一个包release,在release下创建一个接口发布主线程入口,执行该方法进行接口发布package release;import impl.HelloWorldImpl;import inter.HelloWorld;import org.apache.cxf.interceptor.LoggingInInterceptor;import org.apache.cxf.interceptor.LoggingOutInterceptor;import org.apache.cxf.jaxws.JaxWsServerFactoryBean;/*** 发布接口的主线程入口类**/public class ReleasePortMain {public static void main(String[] args) {// TODO Auto-generated method stubHelloWorldImpl implementor = new HelloWorldImpl();//初始化功能实现类JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();//初始或工厂类svrFactory.setServiceClass(HelloWorld.class);//设置发布接口对象svrFactory.setAddress("http://localhost:9000/helloWorld");//自己设置发布接口在JVM 中的访问地址svrFactory.setServiceBean(implementor);//设置接口功能实现类对象svrFactory.getInInterceptors().add(new LoggingInInterceptor());//设置异常抛出svrFactory.getOutInterceptors().add(new LoggingOutInterceptor());//设置异常抛出svrFactory.create();//执行接口发布}}注:如果执行发布接口,抛出如下异常信息: Creating Service {http://inter/}HelloWorldService from class inter.HelloWorldException in thread "main" ng.LinkageError: 正在从引导类加载器加载JAXB 2.1 API, 但此 RI (来自jar:file:/D:/worke/codehy/cxfserver1/lib/jaxb-impl-2.2.5.jar!/com/sun /xml/bind/v2/model/impl/ModelBuilder.class) 需要 2.2 API。
JavaCXF框架调用WebService接口
JavaCXF框架调⽤WebService接⼝WebService接⼝调⽤(CXF框架)maven中添加cxf依赖:<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>3.4.4</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http</artifactId><version>3.4.4</version></dependency>版本请与依赖保持⼀直。
IDEA设置:File -> Setting -> Tools -> Web Service设置CXF为⽣成⼯具根路径,如:C:\DevKit\apache-cxf-3.4.4IDEA Project窗⼝选中要⽣成的包,⼯具栏点击Tools -> WebService -> Generate Java Code From Wsdl 填⼊WSDL地址、输出路径,Service Platform选择CXF,确定⽣成。
PS:IDEA 2019版本存在bug,没有Generate Java Code From Wsdl菜单,详见或更换IDEA版本。
追加Header认证⾸先添加⾃定义Header处理类:static class ClientAuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {/*** 认证头格式:* <tns:RequestSOAPHeader xmlns:tns="http://sys.webservice.client">* <tns:user>user</tns:user>* <tns:password>password</tns:password>* </tns:RequestSOAPHeader>*/private static final String USER = "user";private static final String PASSWORD = "password";public ClientAuthInterceptor() {super(Phase.PREPARE_SEND);}@Overridepublic void handleMessage(SoapMessage message) throws Fault {List<Header> headers = message.getHeaders();Document doc = DOMUtils.createDocument();Element header = doc.createElement("tns:RequestSOAPHeader");header.setAttribute("xmlns:tns", "http://sys.webservice.client");Element user = doc.createElement("tns:user");user.setTextContent(USER);Element password = doc.createElement("tns:password");password.setTextContent(PASSWORD);header.appendChild(user);header.appendChild(password);headers.add(new Header(new QName(""), header));}}导包详情添加⾃定义Header处理器:// 这两⾏是⼯具⽣成出来的接⼝ISysNotifyTodoWebServiceService ss = new ISysNotifyTodoWebServiceService(wsdlURL, SERVICE_NAME);ISysNotifyTodoWebService port = ss.getISysNotifyTodoWebServicePort(); // 创建接⼝时添加⾃定义Header处理器Client client = ClientProxy.getClient(port);client.getOutInterceptors().add(new ClientAuthInterceptor());。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用Apache CXF实现Web Service1.Web service的概念什么是Web Service呢?从表面上看,Web Service就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。
这就是说,你能够用编程的方法通过Web调用来实现某个功能的应用程序。
从深层次上看,Web Service是一种新的Web应用程序分支,它们是自包含、自描述、模块化的应用,可以在网络(通常为Web)中被描述、发布、查找以及通过Web来调用。
一旦部署以后,其他Web Service应用程序可以发现并调用它部署的服务。
Web Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。
它可以使用标准的互联网协议,像超文本传输协议HTTP和XML,将功能体现在互联网和企业内部网上。
Web Service平台是一套标准,它定义了应用程序如何在Web上实现互操作性。
你可以用你喜欢的任何语言,在你喜欢的任何平台上写Web Service。
Web Service是构建互联网分布式系统的基本部件。
"网络服务"(Web Service)的本质,就是通过网络调用其他网站的资源。
举例来说,写一个“四川大地震图片墙”,它能动态显示关于四川地震的最新图片。
但是,所有的图片都不是储存在自己的服务器上,而是来自。
只需要发出一个动态请求,要求向自己提供图片。
这种情况下,提供的就是一种Web service。
如果把图片都存放在本地服务器,不调用,那么我就是在使用“本地服务”。
所以,Web service让你的网站可以使用其他网站的资源,比如在网页上显示天气、地图、twitter上的最新动态等等。
2.Web Service架构和云如果一个软件的主要部分采用了“网络服务”,即它把存储或计算环节“外包”给其他网站了,那么我们就说这个软件属于Web Service架构。
Web Service架构的基本思想,就是尽量把非核心功能交给其他人去做,自己全力开发核心功能。
比如,如果你要开发一个相册软件,完全可以使用Flickr的网络服务,把相片都储存到它上面,你只要全力做好相册本身就可以了。
总体上看,凡是不属于你核心竞争力的功能,都应该把它“外包”出去。
最近很红的“云计算”(cloud computing)或者“云服务”(cloud services),实际上就是Web Service的同义词,不过更形象一些罢了。
它们不说你把事情交给其他计算机去做,而说你把事情交给“云”去做。
3.Web Service的优势Web Servcie最主要的优点是,使用不同程序和在不同系统平台上开发出来的程序,都可以相互通信。
SOAP作为Web Service的基本通信协议,简单,投入和使用的代价也很小。
Web Service使用标准的互联网协议-XML、HTTP和TCP/IP。
Web Service有以下的优越性:1)平台无关。
不管你使用什么平台,都可以使用Web service。
2)编程语言无关。
只要遵守相关协议,就可以使用任意编程语言,向其他网站要求Web service。
这大大增加了web service的适用性,降低了对程序员的要求。
3)对于Web service提供者来说,部署、升级和维护Web service都非常单纯,不需要考虑客户端兼容问题,而且一次性就能完成。
4)对于Web service使用者来说,可以轻易实现多种数据、多种服务的聚合(mashup),因此能够做出一些以前根本无法想像的事情。
4.Web Service 三个基本技术Web Service通过标准通信协议,在互联网上发布有用的程序模块(以服务的方式),目前大部分是用SOAP来作通信协议。
Web Service提供一份详细的接口说明书,来帮助用户构建应用程序,这个接口说明书叫作WSDL(Web Service Description Language)。
通常已发布的Web Service要注册到管理服务器,这样便于使用者查询和使用。
这个是通过UDDI(Universal Discovery Description and Integration)来完成的。
4.1 SOAPSOAP是Web Service的基本通信协议,是一种规范,用来定义SOAP消息的XML格式(XML Format)。
包含在一对 SOAP 元素(SOAP Elements)中的、结构正确的 XML 段就是 SOAP 消息。
SOAP 规范还介绍了如何将程序数据表示为 XML,以及如何使用 SOAP 进行远程过程调用(RPC)。
最后SOAP规范还定义了HTTP消息是怎样传输SOAP消息的。
这并不代表SOAP只能用HTTP来作为传输协议,MSMQ、SMTP、TCP/IP都可以做SOAP的传输协议。
4.2 WSDLWeb Services Description Language的缩写,是一个用来描述Web服务和说明如何与Web服务通信的XML语言。
WSDL是Web Service的描述语言,用于描述Web Service的服务,接口绑定等,为用户提供详细的接口说明书。
举个例子,你要使用供应商的Web Service构建应用程序。
你可以向供应商索取使用Web Service的范例,然后按照范例来构建应用程序。
这样可能出现意料不到的错误,比如说,你在程序中使用的客户代码的数据类型是integer,而供应商使用的数据类型是string。
WSDL详细定义客户端消息的格式,需要什么样的参数,这样可以避免不必要的错误。
要查看 WSDL 的值,可以假设您要调用由您的一位业务伙伴提供的 SOAP 方法。
您可以要求对方提供一些 SOAP 消息示例,然后编写您的应用程序以生成并使用与示例类似的消息。
WSDL 通过明确的表示法指定请求消息必须包含的内容以及响应消息的样式。
WSDL 文件用于说明消息格式的表示法以 XML 架构标准为基础,这意味着它与编程语言无关,而且以标准为基础,因此适用于说明可从不同平台、以不同编程语言访问的 XML Web Service 接口。
除说明消息内容外,WSDL 还定义了服务的位置,以及使用什么通信协议与服务进行通信。
WSDL 文件定义了编写使用 XML Web Service 的程序所需的全部内容。
4.3 UDDIUniversal Description Discovery and Integration即统一描述、发现和集成协议。
UDDI实现了一组可公开访问的接口,通过这些接口,网络服务可以向服务信息库注册其服务信息、服务需求者可以找到分散在世界各地的网络服务。
UDDI 目录条目是介绍所提供的业务和服务的 XML 文件。
可以把它比喻成电话本,电话本里记录的是电话信息,而UDDI记录的是Web Service信息。
你可以不把Web Service注册到UDDI。
但如果要让全球的人知道你的Web Service,最好还是注册到UDDI。
UDDI 目录还包含若干种方法,可用于搜索构建您的应用程序所需的服务。
例如,您可以搜索特定地理位置的服务提供商或者搜索特定的业务类型。
之后,UDDI 目录将提供信息、联系方式、链接和技术数据,以便您确定能满足需要的服务。
UDDI 允许您查找提供所需的 Web 服务的公司。
如果您已经知道要与谁进行业务合作,但尚不了解它还能提供哪些服务,这时该如何处理呢?WS-Inspection 规范允许您浏览特定服务器上提供的 XML Web Service 的集合,从中查找所需的服务。
UDDI 目录说明文件也是一个XML文档,它包括下面三个部分:“白页(White Paper)”介绍提供Web Service的公司信息,比如名称、地址、联系方式等等;“黄页(Yellow Paper)”说明UDDI目录的分类,包括基于标准分类法的行业类别,比如说金融、服务和印刷等等;“绿页(green Paper)”详细介绍了访问服务的接口,以便用户能够编写应用程序以使用 Web 服务。
5.Web Service的开源实现Web Service更多是一种标准,而不是一种具体的技术。
不同的平台,不同的语言大都提供Web Service的开发实现,在JAVA领域,Web Service的框架很多,例如:Axis1&2,Xfire,CXF,java6自带Web Service引擎。
1)从JavaSE6.0开始,Java引入了对Web Service的原生支持。
我们只需要简单的使用Java的Annotation标签即可将标准的Java方法发布成Web Service。
但不是所有的Java 类都可以发布成Web Service。
Java类若要成为一个实现了Web Service的bean,它需要遵循下边这些原则:这个类必须是public类这些类不能是final的或者abstract这个类必须有一个公共的默认构造函数这个类绝对不能有finalize()方法2)Axis2(Apache eXtensible Interaction System)是Apache下的一个重量级WebService框架,准确说它是一个Web Services / SOAP / WSDL 的引擎,是WebService 框架的集大成者,它能不但能制作和发布WebService,而且可以生成Java和其他语言版WebService客户端和服务端代码。
这是它的优势所在。
但是,这也不可避免的导致了Axis2的复杂性,使用过的开发者都知道,它所依赖的包数量和大小都是很惊人的,打包部署发布都比较麻烦,不能很好的与现有应用整合为一体。
但是如果你要开发Java之外别的语言客户端,Axis2提供的丰富工具将是你不二的选择。
3)XFire是一个高性能的WebService框架,在Java6之前,它的知名度甚至超过了Apache的Axis2,XFire的优点是开发方便,与现有的Web整合很好,可以融为一体,并且开发也很方便。
但是对Java之外的语言,没有提供相关的代码工具。
XFire后来被Apache 收购了,原因是它太优秀了,收购后,随着Java6 JWS的兴起,开源的WebService引擎已经不再被看好,渐渐的都败落了。
4)Apache CXF是Apache旗下一个重磅的SOA简易框架,它实现了ESB(企业服务总线)。
CXF 继承了 Celtix 和 XFire 两大开源项目的精华,不仅提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。