您的位置:首页 > 编程语言 > Java开发

使用 Spring + CXF 发布 REST 服务(jax-RS)

2018-01-04 14:06 681 查看
摘要: 使用 Spring + CXF 发布 REST 服务

今天我们将视角集中在 REST 上,它是继 SOAP 以后,另一种广泛使用的 Web 服务。与 SOAP 不同,REST 并没有 WSDL 的概念,也没有叫做“信封”的东西,因为 REST 主张用一种简单粗暴的方式来表达数据,传递的数据格式可以是 JSON 格式,也可以是 XML 格式,这完全由您来决定。

REST 全称是 Representational State Transfer(表述性状态转移),它是 Roy Fielding 博士在 2000 年写的一篇关于软件架构风格的论文,此文一出,震撼四方!许多知名互联网公司开始采用这种轻量级 Web 服务,大家习惯将其称为 RESTful Web Services ,或简称 REST 服务 。

那么 REST 到底是什么呢?

REST 本质上是使用 URL 来访问资源的一种方式。总所周知,URL 就是我们平常使用的请求地址了,其中包括两部分: 请求方式 与 请求路径 ,比较常见的请求方式是 GET 与 POST,但在 REST 中又提出了其它几种其它类型的请求方式,汇总起来有六种:GET、POST、PUT、DELETE、HEAD、OPTIONS。尤其是前四种,正好与 CRUD(增删改查)四种操作相对应:GET(查)、POST(增)、PUT(改)、DELETE(删),这正是 REST 的奥妙所在!

实际上,REST 是一个“无状态”的架构模式,因为在任何时候都可以由客户端发出请求到服务端,最终返回自己想要的数据。也就是说,服务端将内部资源发布 REST 服务,客户端通过 URL 来访问这些资源,这不就是 SOA 所提倡的“面向服务”的思想吗?所以,REST 也被人们看做是一种轻量级的 SOA 实现技术,因此在企业级应用与互联网应用中都得到了广泛使用。

在 Java 的世界里,有一个名为 JAX-RS 的规范,它就是用来实现 REST 服务的,目前已经发展到了 2.0 版本,也就是 JSR-339 规范,如果您想深入研究 REST,请深入阅读此规范。

JAX-RS 规范目前有以下几种比较流行的实现技术:

Jersey: https://jersey.java.net/

Restlet: http://restlet.com/

RESTEasy: http://resteasy.jboss.org/

CXF: http://cxf.apache.org/

本文以 CXF 为例,我努力用最精炼的文字,让您快速学会如何使用 CXF 开发 REST 服务,此外还会将 Spring 与 CXF 做一个整合,让开发更加高效!

使用 Spring + CXF 发布 REST 服务

第一步:添加 Maven 依赖

<properties>
<cxf.version>3.0.0</cxf.version>
<jackson.version>2.4.1</jackson.version>
</properties>

<dependencies>
<!-- CXF -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>${cxf.version}</version>
</dependency>
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>${jackson.version}</version>
</dependency>
</dependencies>

这里仅依赖 Spring Web 模块(无需 MVC 模块),此外就是 CXF 与 Jackson 了。

第二步:配置 web.xml

<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>

使用 Spring 提供的 ContextLoaderListener 去加载 Spring 配置文件 spring.xml;使用 CXF 提供的 CXFServlet 去处理前缀为 /ws/ 的 REST 请求。

第三步:将接口的实现类发布

user.java

@SuppressWarnings("restriction")
@XmlRootElement
public class User implements Serializable{

private static final long serialVersionUID = 1L;
}

UserService.java

@Path("/user")
@Produces( {MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
public interface UserService {
/**
* 获取getMap
*/
@GET
@Path("/getMap")
@Produces( {MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
public Map<String,String> getMap();

/**
* 获取getBean
*/
@GET
@Path("/getBean")
@Produces( {MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
public User getBean();
}

UserServiceImp.java

@Service("userService")
public class UserServiceImp implements UserService{
@Autowired
private UserDao userDao;

public Map<String, String> getMap() {
Map<String, String> map = new HashMap<String, String>();
map.put("111", "222");
return map;
}

public User getBean() {
User user = new User();
user.setUsername("huangyu");
user.setPassword("123456");
return userDao.findUser(user);
}
}

实体要序列化!

第四步:配置 Spring

spring.xml

<!--自动扫描含有@Service将其注入为bean -->
<context:component-scan base-package="com.hy.loong"/>
<import resource="rest-webservice.xml"/>

rest-webservice.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:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd"> <bean id="Jackson" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"></bean>
<jaxrs:server address="/user">
<jaxrs:serviceBeans>
<ref bean="userService"/>
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="Jackson"/>
</jaxrs:providers>
</jaxrs:server>
</beans>

使用 CXF 提供的 Spring 命名空间来配置 Service Bean(即上文提到的 Resource Class)与 Provider。注意,这里配置了一个 address 属性为“/rest”,表示 REST 请求的相对路径,与 web.xml 中配置的“/ws/*”结合起来,最终的 REST 请求根路径是“/ws/rest”,在 ProductService 接口方法上@Path注解所配置的路径只是一个相对路径。

第五步:调用 REST 服务
请求:http://localhost:8080/Loong/ws/user/user/getMap

返回:

{
"11": "222"
}

请求:http://localhost:8080/Loong/ws/user/user/getBean

返回:

{
"id": 1,
"username": "huangyu",
"password": "123456"
}

参考:
[https://my.oschina.net/huangyong/blog/294324?utm_source=tuicool&utm_medium=referral]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring CXF jax-RS