Jersey MVCのサポート

ジャージーMVCサポート

1. 概要

Jersey is an open-source framework for developing RESTFul Web Services

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

このチュートリアルでは、we’ll create a small example application that uses the Model-View-Controller (MVC) extension offered by Jersey

JerseyでAPIを作成する方法については、このwrite-up hereを確認してください。

2. ジャージーのMVC

Jersey contains an extension to support the Model-View-Controller (MVC) design pattern

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

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

To use the capabilities of Jersey MVC in our application, we first need to register the MVC module extension that we wish to use

この例では、人気のあるJavaテンプレートエンジンFreemarkerを使用します。 これは、Mustacheおよび標準のJava Server Pages(JSP)とともに、Jerseyがすぐにサポートするレンダリングエンジンの1つです。

MVCの動作の詳細については、このtutorialを参照してください。

3. アプリケーションのセットアップ

このセクションでは、pom.xml.で必要なMaven依存関係を構成することから始めます。

次に、単純な埋め込みGrizzlyサーバーを使用してサーバーを構成して実行する方法を見ていきます。

3.1. Mavenの依存関係

まず、Jersey MVCFreemarker拡張機能を追加しましょう。

Maven Centralから最新バージョンを取得できます。


    org.glassfish.jersey.ext
    jersey-mvc-freemarker
    2.27

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

ここでも、Maven Centralで最新バージョンを見つけることができます。


    org.glassfish.jersey.containers
    jersey-container-grizzly2-servlet
    2.27

3.2. サーバーの構成

アプリケーションwe need to register the specific JAX-RS features provided by the MVC modulesでJerseyMVCテンプレートサポートを利用するため。

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

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

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

  • まず、packagesメソッドを使用して、@Path. でアノテーションが付けられたクラスのcom.example.jersey.serverパッケージをスキャンするようにJerseyに指示します。これによりFruitResourceが登録されます。

  • 次に、テンプレートを解決するためにベースパスを構成します。 これにより、JerseyはFreemarkerテンプレートの/src/main/resources/templates/freemarker を調べるようになります。

  • 最後に、FreemarkerMvcFeature classを介してFreemarkerレンダリングを処理する機能を登録します

3.3. アプリケーションを実行する

次に、Webアプリケーションの実行方法を見てみましょう。 exec-maven-pluginを使用して、組み込みWebサーバーを実行するようにpom.xmlを構成します。


    org.codehaus.mojo
    exec-maven-plugin
    
        com.example.jersey.server.http.EmbeddedHttpServer
    

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が表示されます。

4. MVCテンプレート

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

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

  • Viewableクラスの使用

  • @Template annotationを使用する

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

4.1. リソースクラスでのViewableの使用

Viewableを見てみましょう:

@Path("/fruit")
public class FruitResource {
    @GET
    public Viewable get() {
        return new Viewable("/index.ftl", "Fruit Index Page");
    }
}

In this example, the FruitResource JAX-RS resource class is the controller.Viewableインスタンスは、単純なString.である参照データモデルをカプセル化します。

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

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

There’s no need to use Viewable every time we want to bind a model to a template

この次の例では、リソースメソッドに@Templateでアノテーションを付けるだけです。

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

    Map 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;
}

Generally speaking, the purpose of the @ErrorTemplate annotation is to bind the model to an error view. このエラーハンドラーは、リクエストの処理中に例外がスローされたときに応答をレンダリングします。

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

In this case, the model is the thrown exception itself.これは、テンプレート内から、例外オブジェクトのメソッドを直接呼び出すことができることを意味します。

これを強調するために、error.ftlテンプレートのスニペットを簡単に見てみましょう。


    

Error - ${model.message}!

最後の例では、簡単な単体テストを見ていきます。

@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つの方法と、エラーを処理する方法を検討しました。

いつものように、記事の完全なソースコードはover on GitHubで入手できます。