使用cxf框架搭建webservice


场景:为APP端开发提供一组接口用于一系列业务操作
简介:笔记主要总结使用CXF框架搭建webservice,发布SOAP及RESTFUL服务。
工具:使用maven管理cxf等依赖,使用tomcat启动webservice发布服务

1. CXF简介

Apache CXF是一个开源的Service框架,用于简化用户的service开发,基于CXF开发的应用可提供SOAP、XML/HTTP、RESTFUL HTTP等服务。CXF底层页可以使用不同的传输协议,包括HTTP、JMS或JBI等。
Apache CXF 是一个开源的 Services 框架,用于简化用户的service开发,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。(参考百度百科)

2. SOAP与RESTFUL简介

SOAP协议是什么?
SOAP(Simple Object Access Protocol,简单对象访问协议)是基于XML的协议,它是分布式系统之间交换信息的轻量级方法,它广泛支持各种系统和RPC以及Messaging等通信模型,是一种非常好的跨平台和跨厂商的技术。

RESTFUL是什么?
RESTFUL是一种软件架构风格、设计风格。RESTFUL视万物皆为资源(有没有想起java的万物皆对象),所以通常使用名词命名(摒弃之前,eg:保存-save,修改-update等动词的使用)而URI(请求路径,增查改删均为统一名词路径,差异在于请求方法,eg:post、get、put、delete)则为资源的唯一标识。

3.项目结构

这里写图片描述

4.搭建webservice

  • 省略Spring、Spring MVC配置
  • 新建webservice.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jaxrs="http://cxf.apache.org/jaxrs"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
    http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd" default-autowire="byName">

    <import resource="classpath*:META-INF/cxf/cxf.xml" />
    <import resource="classpath*:META-INF/cxf/cxf-servlet.xml" />

    <!--下面的class属性值一定要跟你项目中服务实现类的包路径完全一致 -->
    <!-- 登录拦截器 -->
    <!--<bean id="login" class="com.demo.Interceptor.LoginInInterceptor" />-->
    <!-- 异常统一处理 -->
    <bean id="exceptionMapper" class="com.demo.Interceptor.DemoExceptionMapper" />
    <!-- Feature 可捆绑多个拦截器 -->
    <bean id="exceptionHandle" class="com.demo.Interceptor.DemoWSFeature" />
    <!-- 发布soap services-->
    <jaxws:server id="soapService" serviceClass="com.demo.webservice.RsWebServiceImpl" address="/soapService">
        <jaxws:features>
            <ref bean="exceptionHandle" />
        </jaxws:features>
    </jaxws:server>

    <!-- 发布restful services-->
    <jaxrs:server id="rsServices" address="/rsServices">
        <jaxrs:extensionMappings>
            <entry key="json" value="application/json" />
            <entry key="xml" value="application/xml" />
        </jaxrs:extensionMappings>

        <jaxrs:serviceBeans>
            <bean class="com.demo.webservice.RsWebServiceImpl">
            </bean>
        </jaxrs:serviceBeans>
        <jaxrs:features>
            <ref bean="exceptionHandle" />
        </jaxrs:features>
        <jaxrs:providers>
            <!--<ref bean="login" 即可在此配置,也可在features中绑定 />-->
 <!-- 绑定需要在DemoWSFeature类中add到inInterceptors中,参考下面DemoWSFeature-->
            <ref bean="exceptionMapper" />
        </jaxrs:providers>
    </jaxrs:server>

</beans>

DemoWSFeature类

/**
 * 拦截器捆绑类
 * @author eatcrow
 * @create 2018-07-09 18:22
 **/
public class DemoWSFeature extends AbstractFeature {

    @Override
    protected void initializeProvider(InterceptorProvider provider, Bus bus) {
        //  登录拦截器捆绑
        provider.getInInterceptors().add(new LoginInInterceptor());
        //inInterceptors        拦截接收到的消息
        //inFaultInterceptors   拦截接收错误消息
        //outInterceptors       拦截发出去的消息
        //outFaultInterceptors  拦截发出去的错误消息
    }
}
  • pom文件配置

版本号定义

<!-- 定义版本号 -->
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!-- spring版本号 -->
    <spring.version>4.2.4.RELEASE</spring.version>
    <!-- cxf版本 -->
    <cxf.version>3.1.2</cxf.version>
</properties>

cxf pom依赖

<!-- CXF RS (Java API for RESTful Web Services依赖)-->
<!-- 发布restful服务所需jar依赖 -->
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxrs</artifactId>
    <version>${cxf.version}</version>
</dependency>
<!-- CXF WS(Java API for XML Web Services依赖) -->
<!-- 发布soap服务所需jar依赖 -->
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>${cxf.version}</version>
</dependency>
<!-- jackson -->
<dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.5.0</version>
</dependency>

5.异常统一处理

webservice接口进行统一的异常处理

/**
 * 异常统一处理类
 * @author eatcrow
 * @create 2018-07-09 19:36
 **/
public class DemoExceptionMapper implements ExceptionMapper<Exception> {

    @Override
    public Response toResponse(Exception e) {
        //  TODO: 异常的日志记录/封装成自定义的异常等等
        String returnStr = "异常 :"+ e.getClass().getTypeName();

        return  Response.status(Response.Status.INTERNAL_SERVER_ERROR).
                entity(returnStr).type("application/json;charset=UTF-8").build();
    }
}

本文只是将自己搭建的webservice配置进行简单的展示和讲解,作为使用笔记,供后续自己参考。
项目git地址 https://github.com/eatcrow/CXFWebservice.git

猜你喜欢

转载自blog.csdn.net/eatcrow/article/details/81113342