1. 概要

JavaでのRESTWebサービスとそのクライアントの開発を簡素化するために、Jerseyと呼ばれる JAX-RSAPIの標準でポータブルな実装が設計されています。

Jerseyは、 JAX-RS APIのサポートを提供し、JAX-RSリファレンス実装として機能するRESTWebサービスを開発するためのオープンソースフレームワークです。

このチュートリアルでは、さまざまなメディアタイプでJerseyレスポンスボディを設定する方法を見ていきます。

2. Mavenの依存関係

まず、pom.xmlファイルに含まれている次の依存関係が必要です。

<dependency>
    <groupId>org.glassfish.jersey.bundles</groupId>
    <artifactId>jaxrs-ri</artifactId>
    <version>2.26</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.26</version>
</dependency>

JAX-RSの最新バージョンはjaxrs-riにあり、Jerseyサーバーはjersey-serverにあります。

3. ジャージーでの対応

当然、 Jersey を使用して応答を作成する方法はいくつかありますが、以下でそれらを作成する方法を検討します。

ここでのすべての例はHTTPGETリクエストであり、curlコマンドを使用してリソースをテストします。

3.1. OKテキスト応答

ここに示されているエンドポイントは、プレーンテキストをJersey応答として返す方法の簡単な例です。

@GET
@Path("/ok")
public Response getOkResponse() {

    String message = "This is a text response";

    return Response
      .status(Response.Status.OK)
      .entity(message)
      .build();
}

curlを使用してHTTPGETを実行し、応答を確認できます。

curl -XGET http://localhost:8080/jersey/response/ok

このエンドポイントは、次のように応答を返します。

This is a text response

メディアタイプが指定されていない場合、Jerseyはデフォルトでtext/plainになります。

3.2. エラー応答

エラーはJersey応答としてに返送することもできます。

@GET
@Path("/not_ok")
public Response getNOkTextResponse() {

    String message = "There was an internal server error";

    return Response
      .status(Response.Status.INTERNAL_SERVER_ERROR)
      .entity(message)
      .build();
}

応答を確認するために、curlを使用してHTTPGETリクエストを実行できます。

curl -XGET http://localhost:8080/jersey/response/not_ok

エラーメッセージは、応答で返送されます。

There was an internal server error

3.3. プレーンテキストの応答

単純なプレーンテキスト応答を返すこともできます。

@GET
@Path("/text_plain")
public Response getTextResponseTypeDefined() {

    String message = "This is a plain text response";

    return Response
      .status(Response.Status.OK)
      .entity(message)
      .type(MediaType.TEXT_PLAIN)
      .build();
}

ここでも、 curlを使用してHTTPGETを実行し、応答を確認できます。

curl -XGET http://localhost:8080/jersey/response/text_plain

応答は次のようになります。

This is a plain text response

Responsetype()メソッドを使用する代わりに、Producesアノテーションを使用しても同じ結果を得ることができます。

@GET
@Path("/text_plain_annotation")
@Produces({ MediaType.TEXT_PLAIN })
public Response getTextResponseTypeAnnotated() {

    String message = "This is a plain text response via annotation";

    return Response
      .status(Response.Status.OK)
      .entity(message)
      .build();
}

curlを使用して応答検証を行うことができます。

curl -XGET http://localhost:8080/jersey/response/text_plain_annotation

応答は次のとおりです。

This is a plain text response via annotation

3.4. POJOを使用したJSON応答

単純なPlainOld Java Object(POJO)を使用して、Jersey応答を作成することもできます。

以下に示す非常に単純なPerson POJOがあり、これを使用して応答を作成します。

public class Person {
    String name;
    String address;

    // standard constructor
    // standard getters and setters
}

Person POJOを使用して、JSONを応答本文として返すことができるようになりました。

@GET
@Path("/pojo")
public Response getPojoResponse() {

    Person person = new Person("Abhinayak", "Nepal");

    return Response
      .status(Response.Status.OK)
      .entity(person)
      .build();
}

このGETエンドポイントの動作は、次のcurlコマンドを使用して確認できます。

curl -XGET http://localhost:8080/jersey/response/pojo

Person POJOはJSONに変換され、応答として返送されます。

{"address":"Nepal","name":"Abhinayak"}

3.5. 単純な文字列を使用したJSON応答

事前にフォーマットされた文字列を使用して応答を作成でき、簡単に実行できます。

次のエンドポイントは、Stringとして表されるJSONをJersey応答でJSONとして送り返す方法の例です。

@GET
@Path("/json")
public Response getJsonResponse() {

    String message = "{\"hello\": \"This is a JSON response\"}";

    return Response
      .status(Response.Status.OK)
      .entity(message)
      .type(MediaType.APPLICATION_JSON)
      .build();
}

これは、 curlを使用してHTTPGETを実行し、応答を確認することで確認できます。

curl -XGET http://localhost:8080/jersey/response/json

このリソースを呼び出すと、JSONが返されます。

{"hello":"This is a JSON response"}

同じパターンがXMLやHTMLなどの他の一般的なメディアタイプにも適用されます。 MediaType.TEXT_XMLまたはMediaType.TEXT_HTMLを使用してXMLまたはHTMLであることをJerseyに通知するだけで、残りはJerseyが処理します。

4. 結論

この簡単な記事では、さまざまなメディアタイプのJersey(JAX-RS)応答を作成しました。

この記事で言及されているすべてのコードスニペットは、GitHubにあります。