微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CXF创建WebService实例,与maven和spring整合

一、概述
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("[email protected]");  
  •         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生成客户端代码

  • 版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

    相关推荐