背景
由于近期协助其他项目组进行改造,在改造过程中,发现对方代码中有一些不太明白的地方,一直没有使用过,如下:
由于没有接触过这种类似结构,改造起来毫无头绪,所以百度一下。。
概述
java.ws.rs是jax-rs规范中定义的包名
jax-rs全称Java API for RESTful Services
jax-rs规范目前版本是2.0规范文档
jax-rs中定义了
一组启动方式 (以jee作为http容器 还是配合servlet作为http容器)
一组注解@GET, @POST, @DELETE, @PUT, @Consumes … 通过 POJO Resource类 提供Rest服务.
如JSR规范定义Servlet是以继承HttpServlet 并重写doGet doPost do…方法一样 遵循这套标准都可以称为Servlet 写的Servlet程序 可以不经过任何修改放到任何实现Servlet容器中运行 写的jax-rs程序可以不经任何修改和任何jax-rs框架配合使用 而Spring MVC是以Servlet为http容器 并自己构建了一套Api没有遵循jax-rs规范
目前实现jax-rs标准的框架有很多
1、Apache CXF开源的Web服务框架
2、Jersey 由Sun提供的JAX-RS的参考实现
3、RESTEasy JBoss的实现
4、Restlet 由Jerome Louvel和Dave Pawson开发 是最早的REST框架 先于JAX-RS出现
5、Apache Wink 一个Apache软件基金会孵化器中的项目 其服务模块实现JAX-RS规范
既然是Java API for RESTful Services,那自然而然就想到现在比较火爆的springboot,一看资料果然可以集成兼容,选择了Jersey 作为集成对象,走起~
Spring Boot集成Jersey
1、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
引入依赖之后,需要定义一个ResourceConfig资源配置,并且将需要对外暴露为RESTful接口的方法所在的类注册给jersey。
2、编写配置类
@Component
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(Endpoint.class);
}
}
JerseyConfig继承了ResourceConfig,在构造中对Endpoint进行了注册,Endpoint为对外暴露RESTful接口的实现类。
ps:ResourceConfig.register方法支持链式调用,我们可以一次性将所有需要对外暴露的endPoint类都注册给ResourceConfig。
3、编写实现类
@Component
@Path("/hello")
public class Endpoint {
@GET
public String message() {
return "Hello";
}
}
官网告诉我们,每一个注册的endPoint都应该是一个Spring的bean(标注了@Component,@Service等注解,声明为一个Spring的bean),并且需要在类上,方法上标注javax.ws.rs注解,如:@GET、@Path等。
到此我们就完成了基本的Jersey整合Spring Boot的操作,启动应用,通过@Path声明的路径调用我们的接口即可。
4、测试
浏览器请求http://localhost:8080/hello,查看结果:
总的来说,还是比较简单直观的,习惯了使用SpringMVC之后,换一种开发方式也不失为一种新的体验,更重要的,Jersey框架不仅实现了JAX-RS规范,还提供了自有API以扩展JAX-RS, 它作为官方的实现是值得我们去学习的。
拓展:
除了JerseyConfig。我们还可以通过实现ResourceConfigCustomizer接口从而实现endPoint资源的注入:
@Component
public class DemoResourceConfigCustomizer implements ResourceConfigCustomizer {
@Override
public void customize(ResourceConfig config) {
config.register(SpringbootResource.class);
}
}
建立了一个实现ResourceConfigCustomizer接口的配置类DemoResourceConfigCustomizer,实现它的回调方法customize,通过ResourceConfig.register同样实现了资源的注册。