1. 概要

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

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

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

ジャージーでAPIを作成する方法については、こちらの記事をご覧ください。

2. ジャージーのMVC

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

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

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

アプリケーションでJerseyMVCの機能を使用するには、最初に、使用するMVCモジュール拡張機能を登録する必要があります

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

MVCの動作の詳細については、このチュートリアルを参照してください。

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

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

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

3.1. Mavenの依存関係

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

MavenCentralから最新バージョンを入手できます。

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

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

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

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

3.2. サーバーの構成

アプリケーションでJerseyMVCテンプレートサポートを利用するには、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つの項目を構成します。

  • まず、 パッケージジャージーにスキャンするように指示する方法 com.baeldung.jersey.server アノテーションが付けられたクラスのパッケージ @道。 これは私たちを登録します FruitResource
  • 次に、テンプレートを解決するためにベースパスを構成します。 これにより、Jerseyは / src / main / resources / templates /freemarkerでFreemarkerテンプレートを探すようになります。
  • 最後に、FreemarkerMvcFeatureクラスを介してFreemarkerレンダリングを処理する機能を登録します

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

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

<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に移動します。 出来上がり、「ウェルカムフルーツインデックスページ!」 表示されています。

4. MVCテンプレート

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

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

  • 表示可能なクラスの使用
  • @Templateアノテーションの使用
  • MVCでエラーを処理し、特定のテンプレートに渡す方法

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

表示可能から始めましょう。

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

この例では、FruitResourceJAX-RSリソースクラスがコントローラーです。 Viewable インスタンスは、単純なStringである参照データモデルをカプセル化します。

さらに、関連するビューテンプレートへの名前付き参照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 を介してモデルをテンプレート参照に直接ラップする必要がなくなり、リソースメソッドが読みやすくなります。

モデルは、注釈付きリソースメソッドの戻り値で表されます。 地図これはテンプレートに直接渡されます 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アノテーションの目的は、モデルをエラービューにバインドすることです。 このエラーハンドラーは、要求の処理中に例外がスローされたときに応答をレンダリングします。

単純なFruitAPIの例では、処理中にエラーが発生しなかった場合、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つの方法と、エラーを処理する方法について説明しました。

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