加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

CXF创建WebService实例 基于maven

发布时间:2020-12-16 23:10:33 所属栏目:安全 来源:网络整理
导读:?? 一、概述 1、ApacheCXF项目是由ObjectWeb Celtix和CodeHaus XFire合并成立。ObjectWeb Celtix是 由IONA公司赞助,于2005年成立的开源Java ESB产品,XFire则是业界知名的SOAP堆栈。 合并后的ApacheCXF融合该两个开源项目的功能精华,提供了实现SOA所需要的
??

一、概述
1、ApacheCXF项目是由ObjectWeb Celtix和CodeHaus XFire合并成立。ObjectWeb Celtix是
由IONA公司赞助,于2005年成立的开源Java ESB产品,XFire则是业界知名的SOAP堆栈。
合并后的ApacheCXF融合该两个开源项目的功能精华,提供了实现SOA所需要的核心ESB功能框架,
包括SOA服务创建,服务路由,及一系列企业级QoS功能。

2.支持标准
(1)JAX-WS,JSR-181,SAAJ,JAX-RS
(2)SOAP 1.1,1.2,WS-I BasicProfile,WS-Security,WS-Addressing,WS-RM,WS-Policy
(3)WSDL 1.1
(4)MTOM

3.传输方式,绑定,数据绑定,传送数据格式
(1)绑定: SOAP,REST/HTTP
(2)数据绑定: JAXB 2.x,Aegis,XMLBeans,SDO
(3)传送数据格式: XML,JSON,FastInfoset
(4)传输方式: HTTP,Servlet,JMS

?

二、基于SOAP发布webservice

?

(1)pom.xml文件中导入CXF相关包

Xml代码

?

  1. <dependency>??
  2. ????<groupId>org.apache.cxf</groupId>??
  3. ????<artifactId>cxf-rt-core</artifactId>??
  4. ????<version>2.6.2</version>??????????????????
  5. </dependency>??
  6. <dependency>??
  7. ????<groupId>org.apache.cxf</groupId>??
  8. ????<artifactId>cxf-rt-frontend-jaxws</artifactId>??
  9. ????<version>2.6.2</version>??????????????????
  10. </dependency>??
  11. <dependency>??
  12. ????<groupId>org.apache.cxf</groupId>??
  13. ????<artifactId>cxf-rt-transports-http</artifactId>??
  14. ????<version>2.6.2</version>??
  15. </dependency>??

?

(2)web.xml文件中配置

Xml代码

?

  1. <servlet>??
  2. <servlet-name>CXFServlet</servlet-name>???????
  3. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>??
  4. </servlet>??
  5. <servlet-mapping>??
  6. <servlet-name>CXFServlet</servlet-name>??
  7. <url-pattern>/cxf/*</url-pattern>??
  8. </servlet-mapping>??

?

(3)创建webService接口UserService

Java代码

?

  1. package?com.icsshs.dmis.webservice.soap;??
  2. import?javax.jws.WebParam;??
  3. import?javax.jws.WebService;??
  4. import?com.icsshs.dmis.webservice.soap.response.UserDTO;??
  5. /**?
  6. *?JAX-WS2.0的WebService接口定义类?*??
  7. *?使用JAX-WS2.0?annotation设置WSDL中的定义.?
  8. *?使用WSResult及其子类包裹返回结果.?
  9. *?使用DTO传输对象隔绝系统内部领域对象的修改对外系统的影响.?
  10. *??
  11. */??
  12. //name?指明wsdl中<wsdl:portType>元素的名称??
  13. @WebService(name?=?"UserService",?targetNamespace?=?WsConstants.NS)??
  14. public?interface?UserService?{??
  15. ??
  16. ????//@WebService是必须的;@WebParam不是必须的。??
  17. ????//如果没有@WebParam的描述,在wsdl文件内描述的方法中,参数名将变为arg0,arg1…以此类推.??
  18. ????public?String?getUserName(@WebParam(name?=?"userId")String?userId);??
  19. ????public?UserDTO?getUser(@WebParam(name?=?"userId")String?userId);??
  20. }??

?

UserService接口实现类:

Java代码

?

  1. package?com.icsshs.dmis.webservice.soap;??
  2. import?javax.jws.WebService;??
  3. import?com.icsshs.dmis.webservice.soap.response.UserDTO;??
  4. /**?
  5. *?WebService服务端实现类.?
  6. */??
  7. //serviceName指明WSDL中<wsdl:service>与<wsdl:binding>元素的名称,??
  8. //endpointInterface属性指向Interface类全称.??
  9. @WebService(serviceName?=?"UserService",???
  10. ????????endpointInterface?=?"com.icsshs.dmis.webservice.soap.UserService",??
  11. targetNamespace?=?WsConstants.NS)??
  12. public?class?UserServiceImpl?implements?UserService?{??
  13. ????@Override??
  14. ????public?UserDTO?getUser(String?userId)?{??
  15. ????????UserDTO?dto?=?new?UserDTO();??
  16. ????????dto.setId(Long.parseLong("1001"));??
  17. ????????dto.setLoginName("dongwq");??
  18. ????????dto.setName("张三");??
  19. ????????dto.setEmail("dongwq@qq.com");??
  20. ????????return?dto;??
  21. ????}??
  22. ??
  23. ????@Override??
  24. ????public?String?getUserName(String?userId)?{??
  25. ????????return?"dongwq";??
  26. ????}??
  27. }??

?

传输的对象UserDTO类:

Java代码

?

  1. package?com.icsshs.dmis.webservice.soap.response;??
  2. import?javax.xml.bind.annotation.XmlRootElement;??
  3. import?javax.xml.bind.annotation.XmlType;??
  4. import?org.apache.commons.lang3.builder.ToStringBuilder;??
  5. import?com.icsshs.dmis.webservice.soap.WsConstants;??
  6. /**?
  7. *?Web?Service传输User信息的DTO.*??
  8. *?只传输外部接口需要的属性.使用JAXB?2.0的annotation标注JAVA-XML映射,尽量使用默认约定.*??
  9. *?@XmlRootElement指定User为XML的根元素。User类的属性默认指定映射为@XmlElement。?
  10. *?@XmlElement用来定义XML中的子元素。?
  11. *?@XmlType-映射一个类或一个枚举类型成一个XML?Schema类型?
  12. */??
  13. @XmlRootElement??
  14. @XmlType(name?=?"User",?namespace?=?WsConstants.NS)??
  15. public?class?UserDTO?{??
  16. ????private?Long?id;??
  17. ????private?String?loginName;??
  18. ????private?String?name;??
  19. ????private?String?email;??
  20. ????//?相关get、set方法省略。??
  21. }??

?

统一命名空间类定义:

Java代码

?

  1. public?class?WsConstants?{??
  2. ????/**项目内统一的NameSpace定义.**/??
  3. ????/**wsdl2java生成客户端代码时默认按定义的namespace倒序生成包路径?**/??
  4. ????public?static?final?String?NS?=?"http://soap.webservice.dmis.icsshs.com";??
  5. }??

?

(4)在spring的applicationContext.xml文件中进行配置:

Xml代码

?

  1. <?xml?version="1.0"?encoding="UTF-8"?>??
  2. <beans?xmlns="http://www.springframework.org/schema/beans"???
  3. ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  4. ????xmlns:jaxws="http://cxf.apache.org/jaxws"??
  5. ????xsi:schemaLocation="http://cxf.apache.org/jaxws???
  6. ????http://cxf.apache.org/schemas/jaxws.xsd???
  7. ????http://www.springframework.org/schema/beans???
  8. ????http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"??
  9. ????default-lazy-init="true">??
  10. ??
  11. <description>SOAP?Web?Service配置</description>??
  12. <!--??
  13. 1、访问接口服务:http://localhost:8080/dmis/cxf/soap/userService?wsdl??
  14. 2、访问接口中的方法:??
  15. http://localhost:8080/dmis/cxf/soap/userService/getUserName?userId=aaa??
  16. 或:http://localhost:8080/dmis/cxf/soap/userService/getUserName?arg0=aaa??
  17. -->??
  18. <!--?jax-ws?endpoint定义??-->??
  19. <jaxws:endpoint?address="/soap/userService">??
  20. <jaxws:implementor?ref="userService"?/>??
  21. </jaxws:endpoint>??
  22. <!--?WebService的实现Bean定义?-->??
  23. <bean?id="userService"?class="com.icsshs.dmis.webservice.soap.UserServiceImpl"?/>??
  24. </beans>??

?

(5)启动web应用,测试webservice应用是否发布成功。

访问:http://localhost:8080/dmis/cxf/soap/userService?wsdl

?

三、基于SOAP的客户端调用


(1)通过代理API调用,依赖于服务端的接口

Java代码

?

  1. /**?
  2. *?通过代理API调用,依赖于服务端的接口?
  3. */??
  4. public?static?void?testClientByProxy(){??
  5. ????//?调用WebService??
  6. ????JaxWsProxyFactoryBean?factory?=?new?JaxWsProxyFactoryBean();??
  7. ????factory.setServiceClass(UserService.class);??
  8. ????factory.setAddress("http://localhost:8080/dmis/cxf/soap/userService");??
  9. ????UserService?service?=?(UserService)?factory.create();??
  10. ????UserDTO?user?=?service.getUser("1001");??
  11. ????System.out.println(user.getName());??
  12. }??

?

(2)不依赖服务端的接口

Java代码

?

  1. /**?
  2. *?不依赖服务端的接口?
  3. *?@throws?Exception??
  4. */??
  5. public?static?void?testClient()?throws?Exception{??
  6. ????//不依赖服务器端接口来完成调用的,也就是不仅仅能调用Java的接口???
  7. ????JaxWsDynamicClientFactory?clientFactory?=???
  8. ????????JaxWsDynamicClientFactory.newInstance();???
  9. ????Client?client?=?clientFactory.createClient(??
  10. ????????????"http://localhost:8080/dmis/cxf/soap/userService?wsdl");???
  11. ????Object[]?result?=?client.invoke("getUserName",?"1001");???
  12. ????System.out.println(result[0]);??
  13. }??

?

(3)先通过wsdl2Java生成客户端代码,再进行调用

Java代码

?

  1. /**?
  2. *?先通过wsdl2Java生成客户端代码,再进行调用?
  3. */??
  4. public?static?void?testClient2()?{??
  5. ????UserService_Service?serivce?=?new?UserService_Service();??
  6. ????UserService?impl?=?serivce.getUserServiceImplPort();??
  7. ????String?userName?=?impl.getUserName("1001");??
  8. ????System.out.println(userName);??
  9. }??

?

?

四、基于JAX-RS的方式发布WebService


(1)pom.xml文件中导入CXF相关包

Xml代码

?

  1. <dependency>??
  2. ????<groupId>org.apache.cxf</groupId>??
  3. ????<artifactId>cxf-rt-frontend-jaxrs</artifactId>??
  4. ????<version>2.6.2</version>??
  5. </dependency>??
  6. <dependency>??
  7. ????<groupId>com.fasterxml.jackson.jaxrs</groupId>??
  8. ????<artifactId>jackson-jaxrs-json-provider</artifactId>??
  9. ????<version>2.0.5</version>??
  10. </dependency>??

?

(2)web.xml文件中配置,同上

Xml代码

?

  1. <servlet>??
  2. <servlet-name>CXFServlet</servlet-name>???????
  3. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>??
  4. </servlet>??
  5. <servlet-mapping>??
  6. <servlet-name>CXFServlet</servlet-name>??
  7. <url-pattern>/cxf/*</url-pattern>??
  8. </servlet-mapping>??

?

(3)创建webService接口UserJaxRsService

Java代码

?

  1. package?com.icsshs.dmis.webservice.jaxrs;??
  2. import?java.io.IOException;??
  3. import?javax.ws.rs.GET;??
  4. import?javax.ws.rs.POST;??
  5. import?javax.ws.rs.Path;??
  6. import?javax.ws.rs.PathParam;??
  7. import?javax.ws.rs.Produces;??
  8. import?javax.ws.rs.WebApplicationException;??
  9. import?javax.ws.rs.core.MediaType;??
  10. import?javax.ws.rs.core.Response;??
  11. import?javax.ws.rs.core.Response.Status;??
  12. import?org.springframework.beans.factory.annotation.Autowired;??
  13. import?com.icsshs.dmis.entity.bi.BiPerson;??
  14. import?com.icsshs.dmis.service.bi.BiService;??
  15. import?com.icsshs.dmis.webservice.soap.response.UserDTO;??
  16. ??
  17. @Path("/user")??
  18. public?class?UserJaxRsService?{??
  19. ????@Autowired??
  20. ????private?BiService?biService;//业务系统类接口,省略??
  21. ??
  22. ????@GET??
  23. ????@Path("/{personCode}.xml")??
  24. ????@Produces(MediaType.APPLICATION_XML)??
  25. ????public?UserDTO?getAsXml(@PathParam("personCode")?String?personCode)?{??
  26. ????????BiPerson?person?=?biService.findBiPersonByPersonCode(personCode);??
  27. ????????if?(person?==?null)?{??
  28. ????????????String?message?=?"用户不存在(id:"?+?personCode?+?")";??
  29. ????????????throw?buildException(Status.NOT_FOUND,?message);??
  30. ????????}??
  31. ????????UserDTO?dto?=?new?UserDTO();??
  32. ????????dto.setName(person.getPersonName());??
  33. ????????dto.setLoginName(person.getR1PersonId());??
  34. ????????return?dto;??
  35. ????}??
  36. ??
  37. ????@GET??
  38. ????@Path("/{personCode}.json")??
  39. ????@Produces(MediaType.APPLICATION_JSON)??
  40. ????public?UserDTO?getAsJson(@PathParam("personCode")?String?personCode)?{??
  41. ????????BiPerson?person?=?biService.findBiPersonByPersonCode(personCode);??
  42. ????????if?(personCode?==?null)?{??
  43. ????????????String?message?=?"用户不存在(id:"?+?personCode?+?")";??
  44. ????????????throw?buildException(Status.NOT_FOUND,?message);??
  45. ????????}??
  46. ????????UserDTO?dto?=?new?UserDTO();??
  47. ????????dto.setName(person.getPersonName());??
  48. ????????dto.setLoginName(person.getR1PersonId());??
  49. ????????return?dto;??
  50. ????}??
  51. ??
  52. ????@POST??
  53. ????@Path("/addUser")??
  54. ????@Produces(?{?MediaType.APPLICATION_XML,?MediaType.APPLICATION_JSON?})??
  55. ????public?UserDTO?addUser(UserDTO?user)?throws?IOException?{??
  56. ????????System.out.println(user);??
  57. ????????user.setName("jojo##12321321");??
  58. ????????return?user;??
  59. ????}??
  60. ??
  61. ????private?WebApplicationException?buildException(Status?status,?String?message){??
  62. ????????return?new?WebApplicationException(Response.status(status).entity(??
  63. ????????????message).type(MediaType.TEXT_PLAIN).build());??
  64. ????}??
  65. }??

?

(4)在spring的applicationContext.xml文件中进行配置:

Xml代码

?

  1. <?xml?version="1.0"?encoding="UTF-8"?>??
  2. <beans?xmlns="http://www.springframework.org/schema/beans"???
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  4. xmlns:jaxrs="http://cxf.apache.org/jaxrs"??
  5. xsi:schemaLocation="http://cxf.apache.org/jaxrs???
  6. http://cxf.apache.org/schemas/jaxrs.xsd???
  7. http://www.springframework.org/schema/beans???
  8. http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"??
  9. default-lazy-init="true">??
  10. <description>Apache?CXF的Restful?Web?Service配置</description>??
  11. <!--?jax-rs?endpoint定义??-->??
  12. <jaxrs:server?id="serviceContainer"?address="/jaxrs">??
  13. <jaxrs:serviceBeans>??
  14. ????<ref?bean="userJaxRsService"?/>??
  15. </jaxrs:serviceBeans>??
  16. <jaxrs:providers>??
  17. ????<bean?class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider"?/>??
  18. </jaxrs:providers>??
  19. </jaxrs:server>??
  20. <!--?WebService的实现Bean定义?-->??
  21. <bean?id="userJaxRsService"???
  22. ??????class="com.icsshs.dmis.webservice.jaxrs.UserJaxRsService"?/>??
  23. </beans>??

?

(5)启动web应用,测试webservice应用是否发布成功。
访问:http://localhost:8080/dmis/cxf/jaxrs?_wadl

?

五、基于JAX-RS的Restful客户端调用

(1)依赖服务端的接口,通过代理API调用?

Java代码

?

  1. /**?
  2. *?依赖服务端的接口?
  3. *?代理API允许你使用RESTful服务的资源类和接口。?
  4. *?代理类是客户端直接调用接口方法,使用户不需要手工创建HTTP请求。?
  5. */??
  6. public?static?void?testClientByProxy(){???????
  7. ????UserJaxRsService?store?=?JAXRSClientFactory??
  8. ????????????.create("http://localhost:8080/dmis/cxf/jaxrs",???
  9. ????????????????????UserJaxRsService.class);??
  10. ????System.out.println(store.getAsXml("15811006"));??
  11. }??

?(2)通过HTTP客户端进行调用

Java代码

?

  1. /**?
  2. *?HTTP客户端?
  3. *?使用org.apache.cxf.jaxrs.client.WebClient调用RESTful服务?
  4. *?
  5. */??
  6. public?static?void?testClientByHttp(){????????
  7. ????String?format?=?MediaType.APPLICATION_XML;??
  8. ????WebClient?client?=?WebClient.create("http://localhost:8080/dmis/cxf/jaxrs");?????
  9. ????client.path("/user/15811006.xml").accept(format).type(format);?????
  10. ????UserDTO?user?=?client.get(UserDTO.class);?????????
  11. ????System.out.println("userName:?"?+?user.getName());????????
  12. }??

?

3、通过HTTP客户端进行调用,并传递对象

Java代码

?

  1. /**?
  2. *?HTTP客户端(传递对象)???
  3. *?
  4. */??
  5. public?static?void?testClientByObject(){??????????
  6. ????String?format?=?MediaType.APPLICATION_XML;??
  7. ????System.out.println("testAddCategory?called?with?format?"?);?????
  8. ????WebClient?client?=?WebClient.create("http://localhost:8080/dmis/cxf/jaxrs");?????
  9. ????client.path("/user/addUser").accept(format).type(format);?????
  10. ????UserDTO?userDTO?=?new?UserDTO();??
  11. ????userDTO.setName("userName");??
  12. ????userDTO.setLoginName("loginName");??
  13. ????UserDTO?returnUser?=?client.post(userDTO,UserDTO.class);??????????
  14. ????System.out.println("userName:?"?+?returnUser.getName()??
  15. ????????????+"?lgoinName:?"+returnUser.getLoginName());????????
  16. }??

?

注:HTTP客户端调用时,如果不依赖于服务端接口,可通过wsdl2java或wadl2java生成客户端代码。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读