知識庫 / REST RSS 訂閱

RESTEasy 快速入門指南

REST
HongKong
4
03:59 AM · Dec 06 ,2025

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,因為 resteasyservlet-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。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.