RESTEasy是JBoss的一個開源項目,提供一套完整的框架幫助開發(fā)人員構(gòu)建RESTful Web Service和RESTful Java應(yīng)用程序。它是 Jakarta RESTful Web Services規(guī)范的一個完整實現(xiàn),通過Http協(xié)議對外提供基于Java API的 RestFul Web Service。
Java EE 6 引入了對 JSR-311 的支持。JSR-311(JAX-RS:JavaAPI for RESTful Web Services)旨在定義一個統(tǒng)一的規(guī)范,使得 Java 程序員可以使用一套固定的接口來開發(fā) REST 應(yīng)用,避免了依賴于第三方框架。
2018 年初,Eclipse 將 Java EE 更名為 Jakarta EE,JAX-RS也就是現(xiàn)在的Jakarta RESTful Web Services。
網(wǎng)上想找一個RESTEasy的新手教程真的不是那么容易,大部分的文章都比較陳舊了,官方文檔則是一本完善細致的工具手冊,對于我這樣的新手不是那么友好。其中resteasy-tutorial是唯一值得參考的。這篇文章的內(nèi)容很簡單,使用Tomcat運行一個RESTEasy的HelloWorld項目。需要用到的工具及RESTEasy如下所示:
- Intellij IDEA
- RESTEasy 4.5.2.Final
- Tomcat 9.0.26
創(chuàng)建項目
使用Intellij創(chuàng)建一個基于Maven的項目
并引入RESTEasy所需要的依賴,如下所示
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>resteasy-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<resteasy.version>4.5.2.Final</resteasy.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-core</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-servlet-initializer</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
</dependencies>
</project>
對于Servlet的項目,是需要一個web.xml配置文件,用于聲明哪個Servlet的實現(xiàn)類來處理哪個endpoint的請求,而resteasy-servlet-initializer依賴的引入幫助我們簡化了這一步。RESTEasy提供了實現(xiàn)javax.server.ServletContainerInitializer接口的org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer類。這個初始化類將在所有Servlet context初始化前被執(zhí)行,可以用于映射servlets,filter和listener。
因此在src/main/webapp/WEB-INF/web.xml中可以不做任何配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>RestEasy Example</display-name>
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>
</web-app>
這里添加的resteasy.servlet.mapping.prefix適用于在所有的請求前加一個前綴/rest,如果不需要這個前綴也可以忽略此配置。
Application
這個Application和SpringBoot中的@SpringBootApplication很相似。javax.ws.rs.core.Application是一個標準的JAX-RS類,用于提供部署時所需要的一些信息。
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import java.util.HashSet;
import java.util.Set;
@ApplicationPath("/rest")
public class RestEasyServices extends Application {
private Set<Object> singletons = new HashSet<Object>();
public RestEasyServices() {
singletons.add(new MovieCrudService());
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
}
@ApplicationPath注解中的path和xml中定義的是相同的,用于給所有的endpoint添加一個前綴。這里我們重寫了getSingletons,用于提供所有request的處理類,類似于SpringBoot中的Controller,在Restful的定義中,我們的每個request都是用于操作某種資源的,singletons.add(new MovieCrudService())中MovieCrudService就是這樣的一個資源。
Resource
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
@Path("/movies")
public class MovieCrudService {
@GET
@Path("/")
public Response index() {
return Response.status(200).entity("Hi").build();
}
}
無需過多的解釋,代碼足夠簡單清晰,這個類提供了一個endpoint:.../rest/movies/,response就是一個文本Hi。
Deployment
這里使用的是Tomcat作為Servlet容器來運行這個服務(wù),而這個Tomcat也是使用Intellij自帶的

另外注意的一點是需要修改Application Context為/,至于Tomcat的Application Context的作用可以自行Google。

當配置完成后,便可通過Intellij來運行這個項目,運行后便可通過瀏覽器訪問http://localhost:8082/rest/movies
