场景:为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