1. 簡介
JAX-RS (Java API for RESTful Web Services) 是一套 Java API,提供創建 REST API 的支持。 該框架充分利用註解來簡化這些 API 的開發和部署。
在本教程中,我們將使用 RESTEasy,這是 JBoss 提供的 JAX-RS 規範的可移植實現,以創建簡單的 RESTful Web 服務。
2. 項目設置
我們將考慮以下兩種可能的情況:
- 獨立設置 – 適用於所有應用程序服務器
- JBoss AS 設置 – 僅適用於在 JBoss AS 上部署
2.1. 獨立部署
讓我們首先使用 JBoss WildFly 10 進行獨立部署。
JBoss WildFly 10 包含 RESTEasy 版本 6.2.9.Final,但正如您所看到的那樣,我們將使用 pom.xml 配置為最新版本的 6.2.9.Final。
並且,由於使用了 resteasy-servlet-initializer,RESTEasy 通過 ServletContainerInitializer 接口為獨立 Servlet 3.0 容器提供集成。
讓我們查看 pom.xml:
<properties>
<resteasy.version>6.2.9.Final</resteasy.version>
</properties>
<dependencies>
<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>
</dependencies>
jboss-deployment-structure.xml
在JBoss中,所有作為WAR、JAR或EAR部署的模塊都將被視為動態模塊。這些模塊被稱為動態模塊。
此外,還有一些靜態模塊位於$JBOSS_HOME/modules目錄下。由於JBoss具有RESTEasy的靜態模塊(用於獨立部署),因此jboss-deployment-structure.xml是強制性的,以便排除其中一些。
這樣一來,WAR中所有類和JAR文件將被加載。
<jboss-deployment-structure>
<deployment>
<exclude-subsystems>
<subsystem name="resteasy" />
</exclude-subsystems>
<exclusions>
<module name="javaee.api" />
<module name="jakarta.ws.rs.api"/>
<module name="org.jboss.resteasy.resteasy-jaxrs" />
</exclusions>
<local-last value="true" />
</deployment>
</jboss-deployment-structure>2.2. 使用 JBoss 作為部署環境
如果您計劃使用 RESTEasy 與 JBoss 6 或更高版本一起運行,可以選擇採用應用服務器中自帶的庫,從而簡化 pom 文件:
<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependencies>
請注意,jboss-deployment-structure.xml 已不再需要。
3. 服務器端代碼
3.1 Servlet 版本 3 web.xml
現在,讓我們快速查看我們簡單項目的 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
只有在你想要為 API 應用添加一個相對路徑時才需要。在此階段,我們尚未在 web.xml
中聲明任何 Servlet,因為 resteasy 的 servlet-initializer 已作為依賴項添加到 pom.xml 中。原因在於——RESTEasy 提供 org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer 類,該類實現了 jakarta.server.ServletContainerInitializer。ServletContainerInitializer
是一個初始化器,在任何 Servlet 上下文準備就緒之前就會執行——你可以使用此初始化器來定義應用程序的 Servlet、過濾器或監聽器。3.2. 應用類
<em>jakarta.ws.rs.core.Application</em> 類是標準的 JAX-RS 類,你可以實現它來提供有關你的部署的信息。
@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;
}
}如您所見 – 這只是一個類,它列出了所有 JAX-RS 根資源和提供者,並且已使用 註解進行標註。
如果返回空集合用於類和單例,WAR 文件將被掃描以查找 JAX-RS 註解資源和提供者類。
3.3. 服務實現類
以下是一個實際的 API 定義:
@Path("/movies")
public class MovieCrudService {
private Map<String, Movie> inventory = new HashMap<String, Movie>();
@GET
@Path("/getinfo")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Movie movieByImdbId(@QueryParam("imdbId") String imdbId) {
if (inventory.containsKey(imdbId)) {
return inventory.get(imdbId);
} else {
return null;
}
}
@POST
@Path("/addmovie")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response addMovie(Movie movie) {
if (null != inventory.get(movie.getImdbId())) {
return Response
.status(Response.Status.NOT_MODIFIED)
.entity("Movie is Already in the database.").build();
}
inventory.put(movie.getImdbId(), movie);
return Response.status(Response.Status.CREATED).build();
}
}4. 結論
在本快速教程中,我們介紹了 RESTEasy 並使用它構建了一個極其簡單的 API。