Jersey MVCのサポート

1.概要

  • Jersey は、RESTFul Webサービスを開発するためのオープンソースフレームワークです。

JAX-RS参照実装として機能するだけでなく、Webアプリケーション開発をさらに簡素化するための多数の拡張も含まれています。

このチュートリアルでは、Jerseyが提供するModel-View-Controller(MVC)拡張機能を使用した小さなサンプルアプリケーションを作成します。

Jerseyを使ってAPIを作成する方法については、https://www.baeldung.com/jersey-rest-api-with-spring[write-up here]をご覧ください。

[[mvc-in-jersey"]]

2. MVC in Jersey

  • Jerseyには、Model-View-Controller(MVC)設計パターン** をサポートするための拡張機能が含まれています。

まず、Jerseyコンポーネントのコンテキストでは、MVCパターンのControllerはリソースクラスまたはメソッドに対応します。

同様に、ビューはリソースクラスまたはメソッドにバインドされたテンプレートに対応します。最後に、モデルはリソースメソッド(Controller)から返されたJavaオブジェクトを表します。

  • アプリケーションでJersey MVCの機能を使用するには、まず、使用したい** MVCモジュール拡張を登録する必要があります。

この例では、人気の高いJavaテンプレートエンジンhttps://freemarker.apache.org/[Freemarker]を使用します。これは、https://github.com/spullara/mustache.java[Moustache]および標準のJava Server Pages(JSP)と共に、Jerseyがサポートしているレンダリングエンジンの1つです。

MVCの仕組みの詳細については、https://www.baeldung.com/mvc-servlet-jsp[tutorial]を参照してください。

3.アプリケーションの設定

このセクションでは、まず__pom.xmlに必要なMavenの依存関係を設定します。

それでは、シンプルな埋め込みhttp://grizzly.java.net/[Grizzly]サーバーを使用してサーバーを構成して実行する方法を見ていきます。

3.1. Mavenの依存関係

Jersey MVC Freemarkerエクステンションを追加することから始めましょう。

最新版はhttps://search.maven.org/classic/#search%7Cga%7C1%7Cjersey-mvc-freemarker[Maven Central]から入手できます。

<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-mvc-freemarker</artifactId>
    <version>2.27</version>
</dependency>

Grizzlyサーブレットコンテナも必要になります。

Maven Central にも最新バージョンがあります。

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-grizzly2-servlet</artifactId>
    <version>2.27</version>
</dependency>

3.2. サーバーの設定

私たちのアプリケーションでJersey MVCテンプレートサポートを利用するには、MVCモジュールが提供する特定のJAX-RS機能を登録する必要があります。

これを念頭に置いて、カスタムリソース設定を定義します。

public class ViewApplicationConfig extends ResourceConfig {
    public ViewApplicationConfig() {
        packages("com.baeldung.jersey.server");
        property(FreemarkerMvcFeature.TEMPLATE__BASE__PATH, "templates/freemarker");
        register(FreemarkerMvcFeature.class);;
    }
}

上記の例では、3つの項目を構成します。

  • 最初に、 packages メソッドを使用してJerseyにスキャンを指示します

アノテーションが付けられたクラス用の com.baeldung.jersey.server パッケージ [email protected]パス。 これで私たちの FruitResource__が登録されます ** 次に、テンプレートを解決するためにベースパスを設定します。

これは、Jerseyに調べるように伝えます。 _/src/main/resources/templates/freemarker _ for Freemarker テンプレート ** 最後に、Freemarkerレンダリングを処理する機能を登録しました

__FreemarkerMvcFeature __クラスを介して

3.3. アプリケーションの実行

それでは、Webアプリケーションの実行方法を見てみましょう。埋め込みWebサーバーを実行するように pom.xml を設定するには、https://www.mojohaus.org/exec-maven-plugin/[exec-maven-plugin]を使います。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <configuration>
        <mainClass>com.baeldung.jersey.server.http.EmbeddedHttpServer</mainClass>
    </configuration>
</plugin>

それでは、Mavenを使用してアプリケーションをコンパイルして実行しましょう。

mvn clean compile exec:java
...
Jul 28, 2018 6:21:08 PM org.glassfish.grizzly.http.server.HttpServer start
INFO:[HttpServer]Started.
Application started.
Try out http://localhost:8082/fruit
Stop the application using CTRL+C

ブラウザのURL(http://localhost:8080/fruit__)にアクセスします。 Voila、 "Welcome Fruit Index Page!"が表示されます。

4. MVCテンプレート

  • Jerseyでは、MVC APIはモデルをビューにバインドするための2つのクラス、つまり Viewable @ Template で構成されています。 **

このセクションでは、テンプレートをビューにリンクする3つの異なる方法について説明します。

  • Viewable クラスを使う

  • __ @テンプレート __アノテーションの使用

  • MVCのエラーを処理して特定のテンプレートに渡す方法

4.1. リソースクラスで Viewable を使用する

まず Viewable を見てみましょう。

@Path("/fruit")
public class FruitResource {
    @GET
    public Viewable get() {
        return new Viewable("/index.ftl", "Fruit Index Page");
    }
}
  • この例では、 FruitResource JAX-RSリソースクラスがコントローラです。

さらに、関連するビューテンプレートへの名前付き参照、 index.ftl も含めます。

4.2. リソースメソッドで @ Template を使用する

  • モデルをテンプレートにバインドするたびに Viewable を使用する必要はありません** 。

次の例では、リソースメソッドに @ Template という注釈を付けます。

@GET
@Template(name = "/all.ftl")
@Path("/all")
@Produces(MediaType.TEXT__HTML)
public Map<String, Object> getAllFruit() {
    List<Fruit> fruits = new ArrayList<>();
    fruits.add(new Fruit("banana", "yellow"));
    fruits.add(new Fruit("apple", "red"));
    fruits.add(new Fruit("kiwi", "green"));

    Map<String, Object> model = new HashMap<>();
    model.put("items", fruits);
    return model;
}

この例では、 @ Template アノテーションを使用しました。これにより、 Viewable を介してテンプレート参照でモデルを直接ラップすることが回避され、リソースメソッドが読みやすくなります。

モデルはアノテーション付きリソースメソッドの戻り値 - Map <String、Object>。 - で表されます。これはテンプレート all.ftl__に直接渡され、単純にフルーツのリストが表示されます。

4.3. MVCによるエラー処理

それでは、@ @ ErrorTemplate__アノテーションを使用してエラーを処理する方法を見てみましょう。

@GET
@ErrorTemplate(name = "/error.ftl")
@Template(name = "/named.ftl")
@Path("{name}")
@Produces(MediaType.TEXT__HTML)
public String getFruitByName(@PathParam("name") String name) {
    if (!"banana".equalsIgnoreCase(name)) {
        throw new IllegalArgumentException("Fruit not found: " + name);
    }
    return name;
}
  • 一般的に言って、 @ ErrorTemplate アノテーションの目的はモデルをエラービューにバインドすることです。 ** このエラーハンドラは、リクエストの処理中に例外がスローされたときにレスポンスをレンダリングするようにします。

処理中にエラーが発生しなかった場合の単純なFruit APIの例では、 named.ftl テンプレートを使用してページをレンダリングします。そうではなく、例外が発生した場合は error.ftl テンプレートがユーザに表示されます。

  • この場合、モデルはスローされた例外そのものです** これは、テンプレート内から例外オブジェクトに対して直接メソッドを呼び出すことができることを意味します。

これを強調するために、 error.ftl テンプレートの抜粋を見てみましょう。

<body>
    <h1>Error - ${model.message}!</h1>
</body>

最後の例では、簡単なユニットテストを見てみましょう。

@Test
public void givenGetFruitByName__whenFruitUnknown__thenErrorTemplateInvoked() {
    String response = target("/fruit/orange").request()
      .get(String.class);
    assertThat(response, containsString("Error -  Fruit not found: orange!"));
}

上記の例では、フルーツリソースからの応答を使用します。スローされた IllegalArgumentException からのメッセージが応答に含まれていることを確認します。

5.まとめ

この記事では、JerseyフレームワークのMVC拡張について説明しました。

私たちはMVCがジャージーでどのように機能するかを紹介することから始めました。次に、サンプルWebアプリケーションを構成、実行、および設定する方法を見ました。

最後に、JerseyとFreemarkerでMVCテンプレートを使用する3つの方法と、エラーを処理する方法を調べました。

いつものように、この記事の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/jersey[GitHubで利用可能]です。