CXF结合Spring实现WebService

合集下载

springboot-实现WebService(CXF实现)的拦截器(Interceptor)

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 AbstractPha seInterceptor<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开发笔记 1 -- 利用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 WebService入门实例一

学习CXF WebService入门实例一

最近开发开始学习Web Service,如果你是大神,请路过!谢谢!遵循前辈大神们的教导~~~,内事不决问度娘,外事不决问谷歌(现在谷歌已经不能用了),只能问度娘了!上网一百度,套用周董的一句歌词,霍,霍,霍,霍,这么多的套路(axis,axis2,XFire,CXF等),我到底选择哪一个?因为要和Spring进行对接,看了一下,CXF与Spring的耦合度最好,于是就选择了CXF。

上官网下jar包,下了最新的apache-cxf-3.1.4.zip包。

解压出来,看看里面的最简单的实例,apache-cxf-3.1.4\samples\java_first_jaxws,本着你快乐所以我快乐加上不要脸的原则,我抄抄抄,改了一下名字,开发环境jdk1.6, jdk1.5没试过,上眼呐!新建工程mywbs,导入jar包cxf-core-3.1.4.jarjetty-continuation-9.2.11.v20150529.jarjetty-http-9.2.11.v20150529.jarjetty-io-9.2.11.v20150529.jarjetty-server-9.2.11.v20150529.jarjetty-util-9.2.11.v20150529.jarwsdl4j-1.6.3.jarxmlschema-core-2.2.1.jar一、接口类IHelloWorld.javapackage com.ws.hello;import java.util.List;import javax.jws.WebService;import ers;@WebServicepublic interface IHelloWorld {public String sayHello(String name);public String getUserName(Users user);public List<Users> getListUser();}二、实现类(说明endpointInterface = "com.ws.hello.IHelloWorld",IHelloWorld 类加上路径,此处注意)HelloWorldImpl.javapackage com.ws.hello;import java.util.ArrayList;import java.util.List;import javax.jws.WebService;import ers;@WebService(endpointInterface = "com.ws.hello.IHelloWorld",serviceName = "IHelloWorld", portName="IHelloWorldPort")public class HelloWorldImpl implements IHelloWorld {@Overridepublic String sayHello(String name) {return name + ": 您好啊!";}@Overridepublic String getUserName(Users user) {return user.getName();}@Overridepublic List<Users> getListUser() {System.out.println("getListUser called~~~");List<Users> list = new ArrayList<Users>();list.add(new Users(2,"张三"));list.add(new Users(3, "十八罗汉"));list.add(new Users(4,"五王"));return list;}}三、实体类Userspackage com.ws.entity;import java.io.Serializable;public class Users implements Serializable{private static final long serialVersionUID= -5031894017095689998L;private Integer id;private String name;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public Users(Integer id, String name) {super();this.id = id; = name;}public Users() {super();}}Users类如果不写默认构造方法,将报如下异常:Exception in thread "main" javax.xml.ws.WebServiceException: Unable to create JAXBContextatcom.sun.xml.internal.ws.model.AbstractSEIModelImpl.createJAXBContext( Unknown Source)atcom.sun.xml.internal.ws.model.AbstractSEIModelImpl.postProcess(Unknow n Source)atcom.sun.xml.internal.ws.model.RuntimeModeler.buildRuntimeModel(Unknow n Source)atcom.sun.xml.internal.ws.server.EndpointFactory.createSEIModel(Unknown Source)atcom.sun.xml.internal.ws.server.EndpointFactory.createEndpoint(Unknown Source)at com.sun.xml.internal.ws.api.server.WSEndpoint.create(Unknown Source)at com.sun.xml.internal.ws.api.server.WSEndpoint.create(Unknown Source)atcom.sun.xml.internal.ws.transport.http.server.EndpointImpl.createEndp oint(Unknown Source)atcom.sun.xml.internal.ws.transport.http.server.EndpointImpl.publish(Un known Source)atcom.sun.xml.internal.ws.spi.ProviderImpl.createAndPublishEndpoint(Unk nown Source)at javax.xml.ws.Endpoint.publish(Endpoint.java:220)atcom.ws.deploy.DeployHelloWorldService.<init>(DeployHelloWorldService. java:14)atcom.ws.deploy.DeployHelloWorldService.main(DeployHelloWorldService.ja va:23)Caused by: java.security.PrivilegedActionException:com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptionsers does not have a no-arg default constructor.this problem is related to the following location:at ersat public java.util.Listcom.ws.hello.jaxws.GetListUserResponse._returnat com.ws.hello.jaxws.GetListUserResponseat java.security.AccessController.doPrivileged(Native Method)... 13 moreCaused by:com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptionsers does not have a no-arg default constructor.this problem is related to the following location:at ersat public java.util.Listcom.ws.hello.jaxws.GetListUserResponse._returnat com.ws.hello.jaxws.GetListUserResponseatcom.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Buil der.check(Unknown Source)atcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(U nknown Source)atcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(Unknown Source)atcom.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuild er.build(Unknown Source)atcom.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source)at com.sun.xml.internal.bind.api.JAXBRIContext.newInstance(Unknown Source)atcom.sun.xml.internal.ws.developer.JAXBContextFactory$1.createJAXBCont ext(Unknown Source)atcom.sun.xml.internal.ws.model.AbstractSEIModelImpl$1.run(UnknownSource)atcom.sun.xml.internal.ws.model.AbstractSEIModelImpl$1.run(Unknown Source)... 14 more晕了,真是崩溃了,就写了这么几句话!错误代码比正常代码还要多!真是婶婶能忍叔叔不能忍,虽然英语很烂,连猜带蒙吧,看黑色的一句话,大概似乎是告诉我们Users类中没有默认的构造方法,果断加上,错误消失!此处应有掌声!鼓掌!!!四、DeployHelloWorldService.javapackage com.ws.deploy;import javax.xml.ws.Endpoint;import com.ws.hello.HelloWorldImpl;public class DeployHelloWorldService {protected DeployHelloWorldService() throws Exception {System.out.println("Starting Server");HelloWorldImpl implementor = new HelloWorldImpl();//工程名String address = "http://localhost:8080/mywbs";Endpoint.publish(address, implementor);}/*** @param args* @throws Exception*/public static void main(String[] args) throws Exception { new DeployHelloWorldService();System.out.println("Server ready...");Thread.sleep(5 * 60 * 1000);System.out.println("Server exiting");System.exit(0);}}点击运行,正常的话会有Starting ServerServer ready...在IE地址栏中输入:http://localhost:8080/mywbs?wsdl什么你不知道IE地址栏在哪里,对不起,大哥,地球是危险的,你回火星去吧!如果正常的话呢,大约在网页上会出现下面的信息,只截取一部分,注意画粗红线的地方,下面我们用的到。

cxf+spring发布webservice接口及接口的调用

cxf+spring发布webservice接口及接口的调用

一、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接口的实现类。

Apache_CXF整合Spring

Apache_CXF整合Spring

Apache CXF2+Spring2.5轻松实现WebService1.概述CXF 继承了Celtix 和XFire 两大开源项目的精华,提供了对JAX-WS 全面的支持,并且提供了多种Binding 、DataBinding、Transport 以及各种F ormat 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者WSDL 优先(WSDL First)来轻松地实现Web Services 的发布和使用。

Apache CXF 是一个开源的Services 框架,CXF 帮助您利用Frontend 编程API 来构建和开发Services ,像JAX-WS 。

这些Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者JBI,CXF 大大简化了Services 的创建,同时它继承了XFire 传统,一样可以天然地和Spring 进行无缝集成。

2.功能特性CXF 包含了大量的功能特性,但是主要集中在以下几个方面:1.支持Web Services 标准:CXF 支持多种Web Services 标准,包含SO AP、Basic Profile、WS-Addressing、WS-Policy、WS-ReliableMessaging 和WS-Security。

2.Frontends:CXF 支持多种“Frontend”编程模型,CXF 实现了JAX-WS API (遵循JAX-WS 2.0 TCK 版本),它也包含一个“simple frontend”允许客户端和EndPoint 的创建,而不需要Annotation 注解。

CXF 既支持WSDL 优先开发,也支持从Java 的代码优先开发模式。

3.容易使用:CXF 设计得更加直观与容易使用。

有大量简单的API 用来快速地构建代码优先的Services,各种Maven 的插件也使集成更加容易,支持J AX-WS API ,支持Spring 2.0 更加简化的XML 配置方式,等等。

CXF框架实现Webservice服务

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) 技术推动造成系统之间不能互联互通的一个重要原因,就是系统的异构性。

在Spring3.1.0上使用CXF3.0.5开发webservice(一)

在Spring3.1.0上使用CXF3.0.5开发webservice(一)

在Spring3.1.0上使用CXF3.0.5开发webservice(一)一、使用CXF3.0.5生成webservice服务1.首先,在maven上引入cxf使用的jar包依赖:<cxf.version>3.0.5</cxf.version><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-core</artifactId><version>${cxf.version}</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http</artifactId><version>${cxf.version}</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>${cxf.version}</version><exclusions><exclusion><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-ws-policy</artifactId></exclusion><exclusion><groupId>javax.xml.stream</groupId><artifactId>stax-api</artifactId></exclusion></exclusions></dependency>2.在web.xml中添加cxf配置:<!-- 添加webservice服务 --><servlet><servlet-name>CXFService</servlet-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet><servlet-mapping><servlet-name>CXFService</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>3.在Spring文件中引入applicationContext-webservice.xml,文件内容如下:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p"xmlns:jaxws="/jaxws" xmlns:cxf="/core"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.1.xsd/jaxws/schemas/jaxws.xsd"><import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /><bean id="sayHello" class="com.breeze.xiabai.SayHelloImpl"></bean><!--第一种方式--><jaxws:server id="hello" serviceBean="#sayHello" address="/SayHello" /><!--第二种方式<jaxws:endpoint id="hello" implementor="#sayHello" address="/SayHello" />--></beans>4.业务接口类SayHellopackage com.breeze.xiabai;import javax.jws.WebService;@WebServicepublic interface SayHello {public void sayHello(People p);}5.接口实现类SayHelloImplpackage com.breeze.xiabai;import javax.jws.WebService;@WebService(endpointInterface = "com.breeze.xiabai.SayHello")public class SayHelloImpl implements SayHello {@Overridepublic void sayHello(People p) {System.out.println("hello " + p.getName());}}6.访问服务地址:http://AppServername/SayHello?wsdl二、wsdl2java 生成不带JAXBElement的客户端1.在官网下载cxf3.0.5,地址:/download.html2.配置环境变量CXF_HOME3.使用wsdl2java命令生成java文件wsdl2java -p com -d srcl aa.wsdl-p 指定其wsdl的命名空间,也就是要生成代码的包名:-d 指定要产生代码所在目录-client 生成客户端测试web service的代码-server 生成服务器启动web service的代码-impl 生成web service的实现代码-b binding-file-name-frontend jaxws21支持jax-ws2.1如果直接使用wsdl2java.bat -client -d E:/tmp -frontend jaxws21 wsdl文件生成的客户端代码中有JAXBElement<String>新建1.txt,内容为:<jaxb:bindings version="2.1"xmlns:jaxb="/xml/ns/jaxb"xmlns:xjc="/xml/ns/jaxb/xjc"xmlns:xs="/2001/XMLSchema"><jaxb:globalBindings generateElementProperty="false"/> </jaxb:bindings>使用wsdl2java.bat -b "1.txt" -client -d E:/tmp -frontend jaxws21 wsdl文件,就可以生成正常的pojo类折腾了好几天,做个记录。

CXF使用教程(二)——webService自动生成客户端代码

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 就可以⽣成客户端代码了。

个⼈⼀般⽐较喜欢⽤第⼆种⽅法。

webservice学习之使用Apache CXF和spring搭建webservice

webservice学习之使用Apache CXF和spring搭建webservice

webservice学习之使用Apache CXF和spring搭建webservice分类:java 2013-04-03 15:04 285人阅读评论(0) 收藏举报[html]view plaincopy1.1. websrvice概述:(1)webservice的出现可以解决不同平台、不同语言所编写的应用之间相互调用的问题。

(2)webservice不是框架,甚至不是一种技术,而是一种跨平台、跨语言的规范。

2.webservice解决三个问题:(1)远程调用(2)跨平台调用(3)跨语言调用3.实际用途(1)同一个公司新旧系统整合(2)不同公司的业务整合。

比如不同电商调用快递公司的订单查询系统(3)内容聚合。

比如一个应用需要提供天气预报、股票查询、黄金行情等等,需要内容聚合,调用到两不同平台、不同语言开发的应用方法。

4.CXF。

apache基金会的一个开源项目,可以说是SOA框架。

5.webservice的开发:(1)引入spring与cxf需要的jar包:(2)每个webservice组件需要两个部分:接口和实现类.所以建立一个webservice业务接口,使用@WebService注解。

[html]view plaincopy1.package demo.spring.service;2.3.import javax.jws.WebService;4.5.6.@WebService7.public interface HelloWorld {8. String sayHi(String text);9.}(3)定义一个webservice的实现类,实现第二步中定义的接口,也是使用@WebService修饰,但需要指定属性,一般是两个:endpointInterface:当前实现类实现的接口,serviceName:业务名称,可以自行定义[html]view plaincopy1.package demo.spring.service;2.3.import javax.jws.WebService;4.5.import ponent;6.7.@Component("hello")8.@WebService(endpointInterface = "demo.spring.service.HelloWorld")9.public class HelloWorldImpl implements HelloWorld {10.11. public String sayHi(String text) {12. System.out.println("sayHi called");13. return "Hello " + text;14. }15.}(4)配置spring与cxf的配置文件这里定义两个,一个用于server,一个用于client:cxf-servlet.xml:红色部分的配置一定要添加,用于server配置[html]view plaincopy1.<beans xmlns="/schema/beans"2. xmlns:xsi="http://www.w/2001/XMLSchema-instance" <span style="color:#ff0000;">xmlns:jaxws="/jaxws"</span>3. xmlns:context="/schema/context"4. xsi:schemaLocation="/schema/beans5. /schema/beans/spring-beans.xsd6. <span style="color:#ff0000;">/jaxws</span> <span style="color:#ff0000;">/schemas/jaxws.x sd</span>7. /schema/context8. /schema/context/spring-context.xsd">9.10.11. <import resource="classpath:META-INF/cxf/cxf.xml" />12. <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />13. <context:annotation-config />14. <context:component-scan base-package="demo.spring" />15.16. <jaxws:endpoint id="helloWorld" implementor="#hello"17. address="/HelloWorld" />18.19.</beans>id:webservice的endpoint的id。

CXF3.0.2+Spring3.2.14 WebService入门实例四

CXF3.0.2+Spring3.2.14 WebService入门实例四

这次学习CXF WebService传输文件。

CXF采用的是MTOM的机制进行文件传输。

MTOM(Message Transmission Optimization Mechanism)消息优化传输机制。

消息传输优化机制(MTOM) 标准允许将消息中包含的大型数据元素外部化,并将其作为无任何特殊编码的二进制数据随消息一起传送。

MTOM 消息会打包为多部分/相关MIME 序列,放在SOAP 消息中一起传送。

但是在大量数据情况下,如果数据依然进行Base64编码,会带来33%的额外开销,这样的情况对于大量数据交换的情况是无法容忍的。

MTOM 就是针对SOAP 消息传输的基础上提出的改进办法。

对于大量数据的传递,不会进行进行Base64编码,而是直接以附件的二进制原始数据的形式封装在SOAP消息的MIME 部分,进行传输。

………此处略去1000字,自己百度补齐………首先还是要介绍一下开发工具和开发环境,jdk1.6.0_43+Tomcat6.0.29+ MyEclipse10.5,没有使用Maven进行管理!继续学习达拉斯母牛的CXF实战之传输文件(六),博客地址:/accountwcx/article/details/47165321 一、新建web工程,选择Java EE5.0二、新建文件传输类CxfFileWrapper.javapackage com.util;import javax.activation.DataHandler;import javax.xml.bind.annotation.XmlMimeType;import javax.xml.bind.annotation.XmlType;/*** 类名: CxfFileWrapper.java* 作者: 张述飞* 创建时间: 2016-1-7下午2:35:44* 版本: V1.0* 功能描述: CXF上传和下载文件对象包装类由于CXF的DataHandler无法获取文件名和文件类型,需要在上传和下载时附带文件名*/@XmlType(name = "cxfFileWrapper")public class CxfFileWrapper {//文件名private String fileName;//文件扩展名private String fileExtension;//文件二进制数据private DataHandler file;public String getFileName() {return fileName;}public void setFileName(String fileName) {this.fileName = fileName;}public String getFileExtension() {return fileExtension;}public void setFileExtension(String fileExtension) {this.fileExtension = fileExtension;}//注解该字段为二进制流@XmlMimeType("application/octet-stream")public DataHandler getFile() {return file;}public void setFile(DataHandler file) {this.file = file;}}三、新建接口类FileInterface.javapackage com.util;import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebService;import javax.xml.ws.soap.MTOM;/*** 类名: FileInterface.java* 作者: 张述飞* 创建时间: 2016-1-12上午8:24:05* 版本: V1.0* 功能描述:接口类* 说明:@MTOM注解非常重要,如果不写,那么下载文件时会报内存溢出的错误!2016-1-8 15:14:29 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet CXFService threw exceptionng.OutOfMemoryError: Java heap spaceatcom.sun.xml.bind.v2.util.ByteArrayOutputStreamEx.readFrom(ByteArrayOu tputStreamEx.java:75)……………………………*/@WebService(name="fileInterface")@MTOMpublic interface FileInterface {/*** 文件上传* @param file* @return*/@WebMethodpublic boolean upload(@WebParam(name = "file") CxfFileWrapper file);/*** 文件下载* @return* @throws Exception*/@WebMethodpublic CxfFileWrapper download();}四、新建接口实现类FileInterfaceImpl.javapackage com.util;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import javax.activation.DataHandler;import javax.activation.DataSource;import javax.activation.FileDataSource;import javax.jws.WebService;@WebService(endpointInterface="com.util.FileInterface",portName="FileInterPort")public class FileInterfaceImpl implements FileInterface {public boolean upload(CxfFileWrapper file) {boolean result = true;OutputStream os = null;InputStream is = null;BufferedOutputStream bos = null;try {is = file.getFile().getInputStream();/*** 注必须先在D盘新建文件夹newFilejava.io.FileNotFoundException: d:\newFile\LoginDB.bak (系统找不到指定的路径。

CXF框架webservice教程

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 语言。

Spring集成CXF开发详解

Spring集成CXF开发详解

Spring集成CXF详解在Java Web Service开发中,主要使用到的框架有JDK原生实现JAX-WS、Axis、Axis2及CXF等。

关于JDK原生实现可以先看下我之前写的一篇文章《Java RPC 原生实现之WebService详解》。

Axis、Axis2支持多语言,不仅有Java版本,还有C语言版本,有这种需求的推荐使用Axis2。

CXF易使用,与Spring整合非常简单方便,是笔者最多使用的Java Web Service框架。

一项目结构1.1项目结构新建Dynamic Web Project,项目名为cxfWebDemo。

1.2使用的jar包下图所示jar包已满足项目所需,本项目需要使用junit测试,还需要在项目中引入junit类库。

除了spring和cxf核心jar包外,有几个第三方jar包一定要引入,分别是neethi.jar、stax2.jar、woodstox-core.jar、wsdl4j.jar及xmlschema-core.jar二具体实现2.1 接口类接口上要加注释@WebService2.2 实现类实现类上要加@Service,交由spring管理三服务发布及测试3.1 spring配置文件项目源包下新建applicationContext-beans.xml及applicationContext-cxf文件,applicationContext-beans.xml文件主要配置内容:applicationContext-cxf.xml文件主要配置CXF服务端,将服务暴露,供客户端调用,注意下图中两种写法,一种是spring托管方式,一种是java自带注解。

本例中采用的是spring托管方式。

3.2 配置web.xmlweb.xml文件配置如下,配置spring及CXF3.3 发布及测试先将服务发布到应用服务器中,比如Tomcat。

发布后,查看服务是否发布成功,访问如下地址,如图所示,表明服务发布成功。

基于Spring+CXF实现用户文件上传的WebService

基于Spring+CXF实现用户文件上传的WebService
关 键 词 :S r g pi ;W e S ri :M I n b evc e S系统
1 引 言
A a h X 是 一 个 开 源 的 S rie p ceC F ev s框 架 。C F 帮 助 您 利 c X

r t r i n me; e u nfe a l
) p bi v d s t i n me S r g fe a ) u l oi e Fl a ( ti i n me c e n l {
名 称 , 使 用 @We P r 注 释 来 声 明 传 人 变 量 名 称 ,代 码 片 b aa m
段 如下 :
p bi r gg t i n me ) u l Sti e Fl a ( c n e

1) 鑫与 6 -



P O R M N U G … … … … … ~ RGA L GAE A … … …… … … … . … …… … … ~ … … … … … … … …

rt r i t p e u nfe y e; l
行无缝集成 。

2 功 能分 析
( ) 该 We Srie需 要 提 供 报 文 上 传 到 服 务 器 上 的 基 本 1 be e v
功能 。
p bl od s t i t p (tig fey e u i v i e Fl y eS r i tp ) c e n l {

g l
II  ̄









々 ‘






‘} 实用第一 来自智慧密集 。 6 1 I … _ f { … H ,I I x 日

CXF框架介绍及Spring集成

CXF框架介绍及Spring集成

CXF框架介绍及Spring集成1、CXF框架概念介绍 Apache CXF 是⼀个开源的 WebService 框架,CXF可以⽤来构建和开发 WebService,这些服务可以⽀持多种协议,⽐如:SOAP、POST/HTTP、HTTP ,CXF ⼤⼤简化了WebService并且可以天然地和 Spring 进⾏⽆缝集成。

CXF是 Celtrix (ESB框架)和XFire(webserivice)合并⽽成,核⼼是org.apache.cxf.Bus(总线),类似于Spring的 ApplicationContext,CXF默认是依赖于Spring的,另CXF 发⾏包中的jar,如果全部放到lib中,需要 JDK1.6 及以上,否则会报JAX-WS版本不⼀致的问题。

CXF 内置了Jetty服务器,它是servlet容器。

2、CXF框架特点 A、与Spring、Servlet做了⽆缝对接,cxf框架⾥⾯集成了Servlet容器JettyB、⽀持注解的⽅式来发布webserviceC、能够显⽰⼀个webservice的服务列表D、能够添加拦截器:输⼊拦截器、输出拦截器:输⼊⽇志信息拦截器、输出⽇志拦截器、⽤户权限认证的拦截器3、使⽤CXF框架发布⼀个WebService 步骤⼀、 使⽤CXF框架发布WebService需导⼊CXF框架的相关Jar包,此处引⽤的cxf版本为3.1.8,可在官⽅下载该版本后导⼊lib⽬录中的所有jar包 步骤⼆、发布⼀个带接⼝的开发语⾔排⾏榜的WebService,编写接⼝和实现类如下 步骤三、 JaxWsServerFactoryBean是ServerFactoryBean的⼦类,也是功能扩展类。

该类可⽤来发布WebService,此类必须要在被发布为服务的类上添加@WebService注解,如果不加注解,虽然不出错,但也不会对外暴露任何⽅法。

使⽤此类⽣成的wsdl⽂件更加规范,更重要的是可以通过添加拦截器拦截请求,具体实现代码以及代码解释如下:4、使⽤CXF框架和Spring框架集成发布⼀个WebService 前⾯的服务发布包括创建服务类都是硬编码的⽅式,额是否可以使⽤配置的⽅式来发布服务类呢,答案是肯定的。

spring+webservice

spring+webservice
<!--第一种配置方式
<bean id="helloWebservice" class="com.uniland.bean.impl.HelloWebserviceImpl" ></bean>
<jaxws:endpoint id="hello" implementor="#helloWebservice" address="/HelloWebservice"></jaxws:endpoint>
/schema/tx /schema/tx/spring-tx-3.1.xsd
/jaxws/schemas/jaxws.xsd">
2、新建一个项目,导入相应的包文件到项目中去。
3、新建一个接口HelloWebservice
packagecom.uniland.bean;
importjavax.jws.WebService;
/**
*使用@WebService标识让CXF知道使用该接口来创建WSDL文件
*@authoryuanxf
xmlns:jaxws="/jaxws"
xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-3.1.xsd
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

详解Springboot+CXF开发WebServiceDemo

详解Springboot+CXF开发WebServiceDemo

详解Springboot+CXF开发WebServiceDemo最近⼯作中需要⽤到webservice,⽽且结合spring boot进⾏开发,参照了⼀些⽹上的资料,配置过程中出现的了⼀些问题,于是写了这篇博客,记录⼀下我这次spring boot+cxf开发的webservice的配置过程,仅供参考。

⼀、本次开发除了⽤到spring boot基础jar包外,还⽤到了cxf相关jar包:<!-- cxf⽀持 --><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-frontend-jaxws</artifactId><version>3.1.6</version></dependency><dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-rt-transports-http</artifactId><version>3.1.6</version></dependency>⼆、⾸先我们创建⼀个实体类,内容是关于⽤户信息的查询和记录:import java.io.Serializable;import java.util.Date;public class User implements Serializable {private static final long serialVersionUID = -5939599230753662529L;private String userId;private String username;private String age;private Date updateTime;//getter setter ......public void setUserId(String userId) {erId=userId;}public void setUsername(String username) {ername=username;}public void setAge(String age) {this.age=age;}public void setUpdateTime(Date updateTime) {this.updateTime=updateTime;}public String getUserId() {return userId;}public String getUserName() {return username;}public String getAge() {return age;}public Date getUpdateTime() {return updateTime;}}三、接下来我们创建接⼝类:import javax.jws.WebMethod;import javax.jws.WebParam;import javax.jws.WebService;import er;@WebServicepublic interface UserService {@WebMethodString getName(@WebParam(name = "userId") String userId);@WebMethodUser getUser(String userId);}四、有了接⼝类,那么接下来我们对接⼝进⾏实现,也就是接⼝实现类(也就是业务类)代码:package cn.paybay.demo.service.impl;import java.util.Date;import java.util.HashMap;import java.util.Map;import javax.jws.WebService;import er;import erService;@WebService(targetNamespace="/",endpointInterface = "erService")public class UserServiceImpl implements UserService{private Map<String, User> userMap = new HashMap<String, User>();public UserServiceImpl() {System.out.println("向实体类插⼊数据");User user = new User();user.setUserId("411001");user.setUsername("zhansan");user.setAge("20");user.setUpdateTime(new Date());userMap.put(user.getUserId(), user);user = new User();user.setUserId("411002");user.setUsername("lisi");user.setAge("30");user.setUpdateTime(new Date());userMap.put(user.getUserId(), user);user = new User();user.setUserId("411003");user.setUsername("wangwu");user.setAge("40");user.setUpdateTime(new Date());userMap.put(user.getUserId(), user);}@Overridepublic String getName(String userId) {return "liyd-" + userId;}@Overridepublic User getUser(String userId) {System.out.println("userMap是:"+userMap);return userMap.get(userId);}}注释(PS):在发布服务之前,我们要在这⾥对业务实现类进⾏⼀下说明,请⼤家看下图箭头指向的⽅框部分下⾯我来解释⼀下加上图⽅框箭头所指代码的⽬的:在不加上图⽅框箭头所指代码的情况下,你最后发服务的结果是这样的(如下图):所以在发布之前我们要在业务类(UserServiceImpl.java)上增加注解,指定命名空间,然后再进⾏发布,那么我们最终在加上(图⼀)⽅框箭头所指代码情况下,发布服务的结果为下图(请看图三):五、(发布服务)接⼝类,业务类代码都已经准备好,那么我接下来我就要对webservice服务进⾏发布:代码如下:import javax.xml.ws.Endpoint;import org.apache.cxf.Bus;import org.apache.cxf.bus.spring.SpringBus;import org.apache.cxf.jaxws.EndpointImpl;import org.apache.cxf.transport.servlet.CXFServlet;import org.springframework.boot.web.servlet.ServletRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import erService;import erServiceImpl;@Configurationpublic class TestConfig {@Beanpublic ServletRegistrationBean dispatcherServlet() {return new ServletRegistrationBean(new CXFServlet(), "/test/*");}@Bean(name = Bus.DEFAULT_BUS_ID)public SpringBus springBus() {return new SpringBus();}@Beanpublic UserService userService() {return new UserServiceImpl();}@Beanpublic Endpoint endpoint() {EndpointImpl endpoint = new EndpointImpl(springBus(), userService());endpoint.publish("/user");return endpoint;}}可以看到有相关的wsdl描述信息输出了,说明服务已经发布了。

JavaCXF框架调用WebService接口

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());。

基于Spring+CXF实现用户文件上传的webSerivce

基于Spring+CXF实现用户文件上传的webSerivce

基于Spring+CXF实现用户文件上传的webSerivce
孙磊
【期刊名称】《电脑编程技巧与维护》
【年(卷),期】2012(000)003
【摘要】基于Spring+CXF,实现带有基本验证功能的WebService,并实现文件上传和相关查询的功能,以便其在使用.NET或其他框架开发的MIS系统中能够自动生成报文并上传.
【总页数】7页(P16-22)
【作者】孙磊
【作者单位】
【正文语种】中文
【相关文献】
1.一种基于WCF的文件上传方法实现 [J], 周虎;
2.基于jQuery EasyUI框架的动态多文件上传的实现 [J], 谷洪彬
3.一种基于WCF的文件上传方法实现 [J], 周虎
4.基于Struts框架实现文件上传功能 [J], 李鑫
5.基于递归算法的多级独立目录文件上传技术的实现 [J], 张立涛;阮智;汪玲;田越因版权原因,仅展示原文概要,查看原文内容请购买。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CXF结合Spring实现W ebService
一、定义服务接口
package com.cxf.server;
import javax.jws.WebService;
@WebService
public interface Hello {
String SayHi(String text);
}
二、实现服务接口
package com.cxf.server;
import javax.jws.WebService;
@WebService(endpointInterface="com.cxf.server.Hello")
public class HelloImpl implements Hello {
@Override
public String SayHi(String text) {
//System.out.println("客户端传值是:"+text);
int n = text.indexOf(" ");
text = text.substring(n+1, text.length());
return"你好 " + text;
}
}
三、配置applicationcontext.xml
<?xml version="1.0"encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:jaxws="/jaxws"
xsi:schemaLocation="
/schema/beans
/schema/beans/spring-beans.xsd
/jaxws /schemas/jaxws.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"/>
<bean id="hello"class="com.cxf.server.HelloImpl"/>
<jaxws:endpoint id="hellows"implementor="#hello"address="/Hello"/> </beans>
四、配置web.xml
<?xml version="1.0"encoding="UTF-8"?>
<web-app xmlns:xsi="/2001/XMLSchema-instance" xmlns="/xml/ns/javaee"
xmlns:web="/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="/xml/ns/javaee
/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/applicationcontext.xml</param-value> </context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
五、运行Tomcat
六、定义客户端接口
package com.cxf.client;
import javax.jws.WebService;
@WebService
public interface Hello {
String SayHi(String text);
}
七、定义访问类
package com.cxf.client;
import org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext; public class HelloText {
public static void main(String[] args){
ApplicationContext context = new
ClassPathXmlApplicationContext("applicationcontext.xml");
Hello client = (Hello)context.getBean("client");
String s="test";
if (client!=null){
s = client.SayHi("i'm jjd");
}
System.out.println("服务器返回值是:"+s);
}
}
八、配置applicationcontext.xml
<?xml version="1.0"encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:jaxws="/jaxws"
xsi:schemaLocation="
/schema/beans
/schema/beans/spring-beans.xsd
/jaxws /schemas/jaxws.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"/>
<bean id="client"class="com.cxf.client.Hello"
factory-bean="clientFactory"factory-method="create"/>
<bean id="clientFactory"
class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass"value="com.cxf.client.Hello"/>
<property name="address"
value="http://localhost:8080/mycxf/Hello"/>
</bean>
</beans>
九、运行Application。

相关文档
最新文档