通过CXF开发webService接口(soap协议、maven项目)
WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单
![WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单](https://img.taocdn.com/s3/m/6bcbe6d5b9f3f90f76c61bce.png)
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实现Web Service开发
![基于CXF实现Web Service开发](https://img.taocdn.com/s3/m/203d6757ad02de80d4d8407b.png)
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 开发。
WebService之CXF开发指南
![WebService之CXF开发指南](https://img.taocdn.com/s3/m/0fc3a426a32d7375a41780f6.png)
CXF开发指南Web Services、SOA简介:SOA 目前已经成为了人人皆知的热点,对分析人员来讲,SOA 重点需要加强对业务服务的分析;各种不同的服务是 SOA 的重要基础;ESB 则提供了一个舞台,让各种异构系统的业务服务在这里进行实际业务的展现、集成等。
对开发人员来讲,如何更快速地创建出更稳定的业务服务组件是关键;应该更加深入领会使用面向接口的组件化开发方式;开发人员重点是保障服务的生命周期,其它的事情则让业务开发人员来做。
SOA 的重点在于服务的重用,更高一级层次的重用则属于业务层次了。
但是对于开发人员来说,重用的层次需要自己掌握与提升,从代码级到组件级、再到业务层次等。
Web Services是一个软件接口,它描述了一组可以在网络上通过标准化的 XML 消息传递访问的操作。
它使用基于 XML 语言的协议来描述要执行的操作或者要与另一个 Web 服务交换的数据。
Web Services更多是一种标准,而不是一种具体的技术,不同的平台、语言大都提供Web Services的开发实现。
在java领域,Web Services的框架很多,例如:Axis、xfire、CXF…CXF 简介关于 Apache CXFApache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF。
CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。
Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像JAX-WS 。
cxf+spring发布webservice接口及接口的调用
![cxf+spring发布webservice接口及接口的调用](https://img.taocdn.com/s3/m/0245521c79563c1ec4da7110.png)
一、CXF介绍Apache CXF=Celtix+XFire,Apache CXF的前身叫Apache CeltiXfire。
CXF继承了Celtix和XFire两大开源项目的精华,提供了对JAX-WS全面的支持,并且提供了多种Binding、DataBinding、Transport以及各种Format的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者WSDL优先(WSDL First)来轻松地实现Web Services的发布和使用。
Apache CXF已经是一个正式的Apache顶级项目。
CXF支持多种协议,如:SOAP、XML/HTTP、RESTful HTTP、CORBA,并且可以在多种传输协议上运行,比如:HTTP、JMS、JBI。
CXF可以与Spring进行无缝集成。
CXF框架是一种基于Servlet技术的SOA应用开发框架,要正常运行基于CXF应用框架开发的企业应用,除了CXF框架本身之外,还需要JDK和Servlet容器的支持。
CXF下载地址:/download.html,选择“File”列中的zip格式下载。
解压后可以看到一些文件夹:└─apache-cxf-2.5.0├─bin各种工具├─docs API文档├─etc各种配置文件├─lib开发所需jar包├─licenses说明├─modules jar包└─samples使用例子samples文件夹中给提供了在各种环境下使用的例子,个人感觉只需参照样例即可。
二、使用CXF+Spring编写并发布WebService首先,新建一个Web项目,名字叫cxftest,将下载的压缩包中lib文件夹下的jar包全部拷贝到项目的WEB-INF/lib中,在web.xml中配置如下:[html]view plaincopy1.<servlet>2.<servlet-name>CXFServlet</servlet-name>3.<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>4.<load-on-startup>1</load-on-startup>5.</servlet>6.<servlet-mapping>7.<servlet-name>CXFServlet</servlet-name>8.<url-pattern>/services/*</url-pattern>9.</servlet-mapping>然后,在项目src目录下新建包:com.test,在新建的包中创建TestService.java,代码如下:[java]view plaincopy1.package com.test;2.3.import javax.jws.WebService;4.5.@WebService6.public interface TestService{7.8.public String sayHi(String name);9.10.}接着,在创建TestServiceImpl.java,代码如下:[java]view plaincopy1.package com.test;2.3.import javax.jws.WebService;4.5.@WebService(endpointInterface="com.test.TestService")6.public class TestServiceImpl implements TestService{7.8.public String sayHi(String name){9.10.return name+",welcome to here!";11.}12.}CXF中采用注解的方式声明哪些类作为WebService进行发布,@WebService:声明webservice接口;@WebService(endpointInterface="com.test.TestService"):声明这个类是TestService接口的实现类。
CXF框架实现Webservice服务
![CXF框架实现Webservice服务](https://img.taocdn.com/s3/m/af4c0b22ed630b1c59eeb5b3.png)
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) 技术推动造成系统之间不能互联互通的一个重要原因,就是系统的异构性。
Java调用CXFWebService接口的两种方式实例
![Java调用CXFWebService接口的两种方式实例](https://img.taocdn.com/s3/m/64192afe0875f46527d3240c844769eae009a3ce.png)
Java调⽤CXFWebService接⼝的两种⽅式实例1.静态调⽤// 创建WebService客户端代理⼯⼚JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();// 判断是否抛出异常factory.getOutInterceptors().add(new LoggingInInterceptor());// 注册webservice接⼝factory.setServiceClass(DeductionService.class);// 配置webservice地址factory.setAddress("http://localhost:7002/card/services/HelloWorld?wsdl");// 获得接⼝对象CxfService service = (CxfService) factory.create();// 调⽤接⼝⽅法String result = service.sayHello("aaaaaaaaaa");System.out.println("调⽤结果:" + result);// 关闭接⼝连接System.exit(0);2.动态调⽤:JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost:7002/card/services/HelloWorld?wsdl");// url为调⽤webService的wsdl地址QName name = new QName("/", "sayHello");// namespace是命名空间,methodName是⽅法名String xmlStr = "aaaaaaaa";// paramvalue为参数值Object[] objects;try {objects = client.invoke(name, xmlStr);System.out.println(objects[0].toString());} catch (Exception e) {e.printStackTrace();}区别:静态调⽤需要依赖service类,因为客户端调⽤cxf webservice接⼝的过程中需要服务器端提供service,很不⽅便,如果同⼀个项⽬中则没有区别。
利用CXF框架开发webservice接口
![利用CXF框架开发webservice接口](https://img.taocdn.com/s3/m/f5ecdc227c1cfad6195fa7dc.png)
写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 的,客户端程序经常通过
WebService案例Springboot+CXF开发WebServiceDemo
![WebService案例Springboot+CXF开发WebServiceDemo](https://img.taocdn.com/s3/m/0146da90d5d8d15abe23482fb4daa58da0111c05.png)
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接口(soap协议、maven项目)
![通过CXF开发webService接口(soap协议、maven项目)](https://img.taocdn.com/s3/m/81217c9271fe910ef12df85f.png)
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自动生成客户端代码](https://img.taocdn.com/s3/m/d72dfb63f342336c1eb91a37f111f18583d00c47.png)
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](https://img.taocdn.com/s3/m/d82f0b2caf45b307e8719750.png)
用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开发指南、技术文档](https://img.taocdn.com/s3/m/fdc23c5c30b765ce0508763231126edb6f1a76a8.png)
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教程](https://img.taocdn.com/s3/m/bff4a601844769eae009ed30.png)
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接口](https://img.taocdn.com/s3/m/23e9e9651eb91a37f1115cb0.png)
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。
【IT专家】Web Service 那点事儿(2)—— 使用 CXF 开发 SOAP 服务
![【IT专家】Web Service 那点事儿(2)—— 使用 CXF 开发 SOAP 服务](https://img.taocdn.com/s3/m/922a895727d3240c8447ef97.png)
本文由我司收集整编,推荐下载,如有疑问,请与我司联系Web Service 那点事儿(2)—— 使用CXF 开发SOAP 服务2016/04/19 1 选框架犹如选媳妇,选来选去,最后我还是选了“丑媳妇(CXF)”,为什么是它?因为CXF 是Apache 旗下的一款非常优秀的WS 开源框架,具备轻量级的特性,而且能无缝整合到Spring 中。
其实CXF 是两个开源框架的整合,它们分别是:Celtix与XFire,前者是一款ESB 框架,后者是一款WS 框架。
话说早在2007 年 5 月,当XFire 发展到了它的鼎盛时期(最终版本是 1.2.6),突然对业界宣布了一个令人震惊的消息:“XFire is now CXF”,随后CXF 2.0 诞生了,直到2014 年 5 月,CXF 3.0 降临了。
真是7 年磨一剑啊!CXF 终于长大了,相信在不久的将来,一定会取代Java 界WS 龙头老大Axis 的江湖地位,貌Axis 自从2012 年 4 月以后就没有升级了,这是要告别Java 界的节奏吗?还是后面有更大的动作? 如何使用CXF 开发基于SOAP 的WS 呢? 这就是我今天要与您分享的内容,重点是在Web 容器中发布与调用WS,这样也更加贴近我们实际工作的场景。
在CXF 这个主角正是登台之前,我想先请出今天的配角Oracle JAX-WS RI,简称:RI(日),全称:Reference Implementation,它是Java 官方提供的JAX-WS 规范的具体实现。
先让RI 来跑跑龙套,先来看看如何使用RI 发布WS 吧! 1. 使用RI 发布WS第一步:整合Tomcat 与RI 这一步稍微有一点点繁琐,不过也很容易做到。
首先您需要通过以下地址,下载一份RI 的程序包: https://jax-ws.java/2.2.8/ 下载完毕后,只需解压即可,假设解压到D:/Tool/jaxws-ri 目录下。
JavaCXF框架调用WebService接口
![JavaCXF框架调用WebService接口](https://img.taocdn.com/s3/m/416a6579001ca300a6c30c22590102020740f238.png)
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());。
第16讲SOAP与CXF开发WebService
![第16讲SOAP与CXF开发WebService](https://img.taocdn.com/s3/m/72840854551810a6f424864d.png)
二、CXF 入门实例
步骤1.新建java工程cxfservice导入CXF所依赖的核 心jar包
详见课本p414页 请参考小课课件lib目录下的jar包,直接构建到Java
工程中即可
第16讲SOAP与CXF开发 WebService
二、CXF 入门实例
1.使用JAX-WS所提供的Endpoint发布WebService 。(推荐使用方式,本课程使用此方式)
2.使用CXF自身提供的JaxWsServerFactoryBean工 厂类发布WebService。(候选方式,不推荐)
第16讲SOAP与CXF开发 WebService
二、CXF 入门实例
原始发送结点 A
中间节点 B
中间节点 C
最终接收结点 D
消息路径:由一个或多个处理SOAP消息的中间节点构成。SOAP定义三个属性来 控制中间节点和最终接收结点处理Header block:role、relay和mustUnderstand
role:确定Header block所针对的结点 mustUnderStand:指示在Header Block未被认出的情况下该节点是否可以忽略
q 是为了解决互联网中分布式计算所存在的互操作 性问题而出现的。
q 采用:HTTP和XML ①HTTP用于SOAP消息的传输 ②XML是SOAP的编码模式
q SOAP 以XML形式提供了一个简单、轻量的用于 在非集中、分布式环境中交换结构化和对象信息 的机制。
4
第16讲SOAP与CXF开发
WebService
二、CXF 入门实例
q 步骤3:为WebServiebService
q 步骤3:为WebService接口提供实现类
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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/。