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

ApacheCXF-webservice

发布时间:2020-12-16 22:22:20 所属栏目:安全 来源:网络整理
导读:本文来自:http://clq9761.iteye.com/blog/1765707 一、概述 1、ApacheCXF项目是由ObjectWeb Celtix和CodeHaus XFire合并成立。ObjectWeb Celtix是 由IONA公司赞助,于2005年成立的开源Java ESB产品,XFire则是业界知名的SOAP堆栈。 合并后的ApacheCXF融合该

本文来自:http://clq9761.iteye.com/blog/1765707

一、概述
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</artifactId>cxf-rt-coreversion>2.6.2>??????????????????
  3. >cxf-rt-frontend-jaxws>cxf-rt-transports-http>??

(2)web.xml文件中配置

servletservlet-name>CXFServlet>???????
  • servlet-class>org.apache.cxf.transport.servlet.CXFServletservlet-mappingurl-pattern>/cxf/* (3)创建webService接口UserService

    Java代码??

    收藏代码

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

    UserService接口实现类:

    *?WebService服务端实现类.?
  • //serviceName指明WSDL中<wsdl:service>与<wsdl:binding>元素的名称,??
  • //endpointInterface属性指向Interface类全称.??
  • @WebService(serviceName?=?"UserService",???
  • ????????endpointInterface?=?"com.icsshs.dmis.webservice.soap.UserService",??
  • targetNamespace?=?WsConstants.NS)??
  • class?UserServiceImpl?implements?UserService?{??
  • ????@Override??
  • public?UserDTO?getUser(String?userId)?{??
  • ????????UserDTO?dto?=?new?UserDTO();??
  • ????????dto.setId(Long.parseLong("1001"));??
  • ????????dto.setLoginName("dongwq");??
  • ????????dto.setName("张三");??
  • ????????dto.setEmail("dongwq@qq.com");??
  • ????????return?dto;??
  • ????}??
  • public?String?getUserName(String?userId)?{??
  • return?"dongwq";??
  • 传输的对象UserDTO类:

    package?com.icsshs.dmis.webservice.soap.response;??
  • import?javax.xml.bind.annotation.XmlRootElement;??
  • import?javax.xml.bind.annotation.XmlType;??
  • import?org.apache.commons.lang3.builder.ToStringBuilder;??
  • import?com.icsshs.dmis.webservice.soap.WsConstants;??
  • *?Web?Service传输User信息的DTO.*??
  • *?只传输外部接口需要的属性.使用JAXB?2.0的annotation标注JAVA-XML映射,尽量使用默认约定.*??
  • *?@XmlRootElement指定User为XML的根元素。User类的属性默认指定映射为@XmlElement。?
  • *?@XmlElement用来定义XML中的子元素。?
  • *?@XmlType-映射一个类或一个枚举类型成一个XML?Schema类型?
  • @XmlRootElement??
  • @XmlType(name?=?"User",?namespace?=?WsConstants.NS)??
  • class?UserDTO?{??
  • private?Long?id;??
  • private?String?loginName;??
  • private?String?name;??
  • private?String?email;??
  • //?相关get、set方法省略。??
  • 统一命名空间类定义:

    class?WsConstants?{??
  • /**项目内统一的NameSpace定义.**/??
  • /**wsdl2java生成客户端代码时默认按定义的namespace倒序生成包路径?**/??
  • static?final?String?NS?=?"http://soap.webservice.dmis.icsshs.com";??
  • (4)在spring的applicationContext.xml文件中进行配置:

    <?xml?version="1.0"?encoding="UTF-8"?>??
  • beans?xmlns="http://www.springframework.org/schema/beans"???
  • ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  • ????xmlns:jaxws="http://cxf.apache.org/jaxws"??
  • ????xsi:schemaLocation="http://cxf.apache.org/jaxws???
  • ????http://cxf.apache.org/schemas/jaxws.xsd???
  • ????http://www.springframework.org/schema/beans???
  • ????http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"??
  • ????default-lazy-init="true"description>SOAP?Web?Service配置 <!--??
  • 1、访问接口服务:http://localhost:8080/dmis/cxf/soap/userService?wsdl??
  • 2、访问接口中的方法:??
  • http://localhost:8080/dmis/cxf/soap/userService/getUserName?userId=aaa??
  • 或:http://localhost:8080/dmis/cxf/soap/userService/getUserName?arg0=aaa??
  • -- <!--?jax-ws?endpoint定义??-->??
  • jaxws:endpoint?address="/soap/userService"jaxws:implementor?ref="userService"?/>??
  • jaxws:endpoint<!--?WebService的实现Bean定义?-->??
  • bean?id="userService"?class="com.icsshs.dmis.webservice.soap.UserServiceImpl"?beans (5)启动web应用,测试webservice应用是否发布成功。

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

    三、基于SOAP的客户端调用


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

    *?通过代理API调用,依赖于服务端的接口?
  • void?testClientByProxy(){??
  • //?调用WebService??
  • ????JaxWsProxyFactoryBean?factory?=?new?JaxWsProxyFactoryBean();??
  • ????factory.setServiceClass(UserService.class);??
  • ????factory.setAddress("http://localhost:8080/dmis/cxf/soap/userService");??
  • ????UserService?service?=?(UserService)?factory.create();??
  • ????UserDTO?user?=?service.getUser("1001");??
  • ????System.out.println(user.getName());??
  • (2)不依赖服务端的接口

    *?不依赖服务端的接口?
  • *?@throws?Exception??
  • void?testClient()?throws?Exception{??
  • //不依赖服务器端接口来完成调用的,也就是不仅仅能调用Java的接口???
  • ????JaxWsDynamicClientFactory?clientFactory?=???
  • ????????JaxWsDynamicClientFactory.newInstance();???
  • ????Client?client?=?clientFactory.createClient(??
  • ????????????"http://localhost:8080/dmis/cxf/soap/userService?wsdl");???
  • ????Object[]?result?=?client.invoke("getUserName",?"1001");???
  • ????System.out.println(result[0]);??
  • (3)先通过wsdl2Java生成客户端代码,再进行调用

    *?先通过wsdl2Java生成客户端代码,再进行调用?
  • void?testClient2()?{??
  • ????UserService_Service?serivce?=?new?UserService_Service();??
  • ????UserService?impl?=?serivce.getUserServiceImplPort();??
  • ????String?userName?=?impl.getUserName("1001");??
  • ????System.out.println(userName);??
  • 四、基于JAX-RS的方式发布WebService


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

    >cxf-rt-frontend-jaxrs>com.fasterxml.jackson.jaxrs>jackson-jaxrs-json-provider>2.0.5 (2)web.xml文件中配置,同上

    (3)创建webService接口UserJaxRsService

    package?com.icsshs.dmis.webservice.jaxrs;??
  • import?java.io.IOException;??
  • import?javax.ws.rs.GET;??
  • import?javax.ws.rs.POST;??
  • import?javax.ws.rs.Path;??
  • import?javax.ws.rs.PathParam;??
  • import?javax.ws.rs.Produces;??
  • import?javax.ws.rs.WebApplicationException;??
  • import?javax.ws.rs.core.MediaType;??
  • import?javax.ws.rs.core.Response;??
  • import?javax.ws.rs.core.Response.Status;??
  • import?org.springframework.beans.factory.annotation.Autowired;??
  • import?com.icsshs.dmis.entity.bi.BiPerson;??
  • import?com.icsshs.dmis.service.bi.BiService;??
  • @Path("/user")??
  • class?UserJaxRsService?{??
  • @Autowired??
  • private?BiService?biService;//业务系统类接口,省略??
  • @GET??
  • @Path("/{personCode}.xml")??
  • @Produces(MediaType.APPLICATION_XML)??
  • public?UserDTO?getAsXml(@PathParam("personCode")?String?personCode)?{??
  • ????????BiPerson?person?=?biService.findBiPersonByPersonCode(personCode);??
  • if?(person?==?null)?{??
  • ????????????String?message?=?"用户不存在(id:"?+?personCode?+?")";??
  • ????????????throw?buildException(Status.NOT_FOUND,?message);??
  • ????????}??
  • ????????dto.setName(person.getPersonName());??
  • ????????dto.setLoginName(person.getR1PersonId());??
  • @Path("/{personCode}.json")??
  • @Produces(MediaType.APPLICATION_JSON)??
  • public?UserDTO?getAsJson(if?(personCode?==?@POST??
  • @Path("/addUser")??
  • @Produces(?{?MediaType.APPLICATION_XML,?MediaType.APPLICATION_JSON?})??
  • public?UserDTO?addUser(UserDTO?user)?throws?IOException?{??
  • ????????System.out.println(user);??
  • ????????user.setName("jojo##12321321");??
  • return?user;??
  • private?WebApplicationException?buildException(Status?status,?String?message){??
  • return?new?WebApplicationException(Response.status(status).entity(??
  • ????????????message).type(MediaType.TEXT_PLAIN).build());??
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  • xmlns:jaxrs="http://cxf.apache.org/jaxrs"??
  • xsi:schemaLocation="http://cxf.apache.org/jaxrs???
  • http://cxf.apache.org/schemas/jaxrs.xsd???
  • http://www.springframework.org/schema/beans???
  • http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"??
  • default-lazy-init="true">Apache?CXF的Restful?Web?Service配置<!--?jax-rs?endpoint定义??-->??
  • jaxrs:server?id="serviceContainer"?address="/jaxrs"jaxrs:serviceBeansref?bean="userJaxRsService"?jaxrs:providersbean?class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider"?jaxrs:serverbean?id="userJaxRsService"???
  • ??????class="com.icsshs.dmis.webservice.jaxrs.UserJaxRsService"? (5)启动web应用,测试webservice应用是否发布成功。
    访问:http://localhost:8080/dmis/cxf/jaxrs?_wadl

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

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

    *?依赖服务端的接口?
  • *?代理API允许你使用RESTful服务的资源类和接口。?
  • *?代理类是客户端直接调用接口方法,使用户不需要手工创建HTTP请求。?
  • void?testClientByProxy(){???????
  • ????UserJaxRsService?store?=?JAXRSClientFactory??
  • ????????????.create("http://localhost:8080/dmis/cxf/jaxrs",250)"> ????????????????????UserJaxRsService. ????System.out.println(store.getAsXml("15811006"));??
  • ?(2)通过HTTP客户端进行调用

    *?HTTP客户端?
  • *?使用org.apache.cxf.jaxrs.client.WebClient调用RESTful服务?
  • *?
  • void?testClientByHttp(){????????
  • ????String?format?=?MediaType.APPLICATION_XML;??
  • ????WebClient?client?=?WebClient.create("http://localhost:8080/dmis/cxf/jaxrs");?????
  • ????client.path("/user/15811006.xml").accept(format).type(format);?????
  • ????UserDTO?user?=?client.get(UserDTO.class);?????????
  • ????System.out.println("userName:?"?+?user.getName());????????
  • 3、通过HTTP客户端进行调用,并传递对象

    *?HTTP客户端(传递对象)???
  • void?testClientByObject(){??????????
  • ????System.out.println("testAddCategory?called?with?format?"?);?????
  • ????client.path("/user/addUser").accept(format).type(format);?????
  • ????UserDTO?userDTO?=? ????userDTO.setName("userName");??
  • ????userDTO.setLoginName("loginName");??
  • ????UserDTO?returnUser?=?client.post(userDTO,UserDTO.class);??????????
  • ????System.out.println("userName:?"?+?returnUser.getName()??
  • ????????????+"?lgoinName:?"+returnUser.getLoginName());????????
  • 注:HTTP客户端调用时,如果不依赖于服务端接口,可通过wsdl2java或wadl2java生成客户端代码。

  • (编辑:李大同)

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

      推荐文章
        热点阅读