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を確認してみましょう。
以上。
コメント