はじめに
Spring Bootを用いたREST APIの動作確認でリクエスト・レスポンスのJSONを整形した状態でログ出力したくなった。
logback.xmlの設定でログ全体をJSONとして整形・出力する方法はすぐに見つかったが、パラメータのJSONのみ整形する方法になかなか辿り着けなかったためメモ。
サンプルプロジェクト
- spring initializerで作成。
- Spring Boot : 2.6.1
- spring-boot-starter-web, lombok を使用
解決策
ObjectMapperのインスタンス生成時にSerializationFeature.INDENT_OUTPUT
を設定し、オブジェクトをJSONに変換する。
実装
動作確認したサンプルを以下に記載します。
モデルクラス
TestModel.java
package com.example.demo;
import lombok.Data;
@Data
public class TestModel {
private int id;
private String name;
private int age;
}
コントローラ
Controller.java
package com.example.demo;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import lombok.extern.slf4j.Slf4j;
@RestController
@RequestMapping("/test")
@Slf4j
public class Controller {
@GetMapping("/prettyjson")
@ResponseStatus(HttpStatus.OK)
public String prettyjson() {
TestModel model = new TestModel();
model.setId(1);
model.setName("Ken");
model.setAge(20);
// インスタンス生成時に SerializationFeature.INDENT_OUTPUT を設定することで整形される
ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
String json = "";
try {
json = mapper.writeValueAsString(model);
log.info(json);
} catch (JsonProcessingException e) {
log.error(e.getMessage());
}
return json;
}
}
動作確認
curlでリクエストを投げてみる。
curl localhost:8080/test/prettyjson
出力結果(curl)
{
"id" : 1,
"name" : "Ken",
"age" : 20
}
出力結果(ログ)
2021-12-04 18:06:40.208 INFO 21036 --- [io-8080-exec-1] com.example.demo.Controller : {
"id" : 1,
"name" : "Ken",
"age" : 20
}
期待通りの結果が得られました!
おわりに
REST APIの開発は今回が初めてだったんですが、JSONの整形出力ってpretty-printと言うんですね。。。
はじめて知りました(笑)
検索ワードで pretty print を使っていればもっと早く参考資料にたどり着けたはず。