1前書き

  • JAX-RS

    (RESTful Webサービス用のJava API)は、

    REST API ** の作成をサポートする一連のJava APIです。そしてフレームワークはアノテーションをうまく利用してこれらのAPIの開発とデプロイを単純化します。

このチュートリアルでは、簡単なRESTful Webサービスを作成するために、JBossが提供するJAX-RS仕様の移植可能な実装であるRESTEasyを使用します。


2プロジェクト設定

2つのシナリオを検討します。

  • スタンドアローンセットアップ – すべてのアプリケーションサーバーで作業するためのもの

  • JBoss ASセットアップ – JBoss ASでのデプロイメントについてのみ考慮する


2.1. スタンドアロンセットアップ

スタンドアローンセットアップで

JBoss WildFly 10

を使うことから始めましょう。

JBoss WildFly 10にはRESTEasyバージョン3.0.11が付属していますが、ご覧のとおり、

pom.xml

を新しい3.0.14バージョンで設定します。

そして


resteasy-servlet-initializer


のおかげで、RESTEasyは

ServletContainerInitializer

統合インターフェースを介してスタンドアロンの

Servlet 3.0

コンテナーとの統合を提供します。



  • pom.xml





    _:





    + _ ** を見てみましょう。

<properties>
    <resteasy.version>3.0.14.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

static modules

があります – スタンドアロンデプロイメントの場合、

jboss-deployment-structure.xml__はそれらのいくつかを除外するために必須です。

このようにして、

WAR

に含まれるすべてのクラスと

JAR

ファイルがロードされます。

<jboss-deployment-structure>
    <deployment>
        <exclude-subsystems>
            <subsystem name="resteasy"/>
        </exclude-subsystems>
        <exclusions>
            <module name="javaee.api"/>
            <module name="javax.ws.rs.api"/>
            <module name="org.jboss.resteasy.resteasy-jaxrs"/>
        </exclusions>
        <local-last value="true"/>
    </deployment>
</jboss-deployment-structure>


2.2. JBoss ASセットアップ

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. サーブレットバージョン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アプリケーションへの相対パスを先頭に付ける場合にのみ必要です。


  • resteasy




    servlet-initializer


    が依存関係として


    pom.xml


    に追加されたため、この時点では、



    web.xml ** で

    Servlet

    を宣言していないことに注意することが非常に重要です。その理由は – RESTEasyは

    javax.server.ServletContainerInitializer

    を実装する

    org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer

    クラスを提供します。


ServletContainerInitializer

はイニシャライザであり、サーブレットコンテキストが準備される前に実行されます – このイニシャライザを使用して、アプリのサーブレット、フィルタ、またはリスナを定義できます。


3.2. アプリケーションクラス

javax.ws.rs.core.Applicationクラスは、デプロイメントに関する情報を提供するために実装できる標準の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ルートリソースとプロバイダをリストしたクラスであり、

@ ApplicationPath

アノテーションが付けられています。

クラスとシングルトンによる空のセットを返すと、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を構築しました。

この記事で使われている例はhttps://github.com/eugenp/tutorials/tree/master/resteasy[GitHubのサンプルプロジェクト]として入手できます。