Jersey(JAX-RS)でJSONを受け取るには@Produces以外にpom.xmlの設定も必要

json Java
スポンサーリンク

Jerseyでは、メディアタイプに”application/json”を指定するだけではレスポンスをJSON形式で送ることができません。少し躓きポイントがありますので、この記事で紹介させていただきます。

JSONを扱うときは@Producesとpom.xmlの設定を行う

@Producesでメディアタイプを指定する

Jerseyでは、@Producesでメディアタイプを指定します。
メディアタイプには次のようなものがあります。

  • text/plane : テキスト形式のファイル
  • text/html :  HTMLコンテンツ
  • image/png : PNG形式の画像

今回はJSONですので、“application/json”になります。
以下のGETメソッドでは、@Produces(MediaType.APPLICATION_JSON)を指定してMapのデータをでJSON形式で返しています。

@Path("example")
public class ExampleResource {

	@GET
	@Path("list")
	@Produces(MediaType.APPLICATION_JSON)
	public Response getUserName(@PathParam("username") String userName) {
		Map<String, String> map = new HashMap<>();
		map.put("111", "apple");
		map.put("222", "orange");
		map.put("333", "peach");
		return Response.status(Status.OK).entity(map).build();
	}

}

これでコード上は問題ないのですが、こちらを動かすとHTTP/1.1 500 Internal Server Errorが帰ってきます。

 % curl -i http://localhost:8080/example/list
HTTP/1.1 500 Internal Server Error
Connection: close
Content-Length: 0

サーバーログにも、このような文章が…

6月 27, 2021 1:08:36 午後 org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo
重大: MessageBodyWriter not found for media type=application/json, type=class java.util.HashMap, genericType=class java.util.HashMap.

メディアタイプapplication/jsonが見つからないと言われております。
この原因は、pom.xmlファイルでjsonをサポートするdependencyを追加していないことにあります。追加されていないから見つからないわけです。

pom.xmlにjersey-media-json-bindingを追加する

pom.xmlに以下を追加すれば問題なく動作するようになります。

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-binding</artifactId>
    <version>使用したいバージョン</version>
 </dependency>

versionは皆さんの環境に合わせて設定してください。

Jerseyのサンプルコードを使用している場合は、この箇所がコメントアウトされている状態になっています。

<!-- uncomment this to get JSON support:
  <dependency>
     <groupId>org.glassfish.jersey.media</groupId>
     <artifactId>jersey-media-json-binding</artifactId>
 </dependency>
 -->

このコメントアウトを削除するだけでOKです。

準備が整いましたら、もう一度実行してみましょう。
プロジェクトのアップデートも忘れずに。

% curl -i http://localhost:8080/example/list
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 44

{"111":"apple","222":"orange","333":"peach"}%  

HTTP/1.1 200 OKが帰ってきて、MapのデータもJSON形式で表示されています。

正常に動かないときは、pom.xmlを確認してみましょう。

以上。

コメント

タイトルとURLをコピーしました