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