タイトルではToString
を加工するような書き方をしていますが、処理イメージを伝えるものですのでToString
は使用しません。
デバッグのためにLombok
で大量のフィールドをもつクラスをToString
で出力すると、当然大きな文字列となります。基本的には全フィールドを出力する方がよいのですが、場合によっては不要なフィールドを除いたメッセージの方が読みやすいです。
今回の記事では、値がnullの項目を除去したデバッグメッセージを出力する方法を記載します。なお、最終的には比較が目的のため、今回はJSON形式での出力をゴールとします。
環境
- Java
- 17
- com.fasterxml.jackson.core
- 2.13.4
- ※ SpringBootに依存したバージョンです
- 2.13.4
ゴール
デフォルトだと左で出力されるので、右で出力できればゴールです。
対応
JSON形式で出力するため、ObjectMapper
を使用します。ObjectMapper#setSerializationInclusion
でnullの扱いを設定できるので、今回はnullを表示しないためにJsonInclude.Include.NON_NULL
を渡してください。後は、ObjectMapper#writeValueAsString
にデバッグメッセージを出力したいインスタンスを渡すことで、JSON形式で出力されます。
public static String debugJson(Object object) { ObjectMapper om = new ObjectMapper(); om.setSerializationInclusion(JsonInclude.Include.NON_NULL); return om.writeValueAsString(object); }
LocalDateTimeを文字列化したい
デフォルト設定のままだと、LocalDate
, LocalDateTime
等々は文字列化(シリアライズ)ができません。今回は、LocalDateTime
をyyyy/MM/dd hh:mm:ss
で出力する設定を記載します。
JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer( LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy/MM/dd hh:mm:ss")) ); om.registerModule(javaTimeModule);
アノテーションで特定の項目は無視したい
プロダクトコードを修正していいのであれば、対象のフィールドに対してJsonIgnore
を付与すると出力しなくなります。
@JsonIgnore private String ignore;
フィルタで特定の項目は無視したい
フィルタを設定することで、不必要な項目を出力しないようにできます。
SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter .serializeAllExcept("id", "ignore"); // 無視したい項目 FilterProvider filters = new SimpleFilterProvider() .addFilter("myFilter", theFilter); // 特に意味がない? om.writer(filters).writeValueAsString(object);
ソースコード
私が動作確認したときのテストコードは残しますので、詳しい処理はソースで確認してください。
- https://github.com/hirotoKirimaru/cucumber-sample/blob/f901a9bb1136d129d1d41a27173f1e504055fab7/kirimaru-core/src/main/java/kirimaru/helper/Debugs.java#L22
- https://github.com/hirotoKirimaru/cucumber-sample/blob/f901a9bb1136d129d1d41a27173f1e504055fab7/kirimaru-core/src/test/java/kirimaru/helper/DebugsTest.java#L18
備考
ToString
のアノテーションで特定の項目を除外する方法は、私の過去記事を参考にしてください。
実行時の条件によって変更する方法は見つかりませんでした。
終わりに
今回の処理は、過去の自分のブログに助けられました。
もう少しカスタマイズしたい場合は、Jackson
ライブラリの使い方を検索すればよいです。私は最低限ここまで知れればデバッグメッセージとしては十分ですので、もっと深く知りたい方は別の方の記事を参考にしてください。
類似情報
- REST APIのレスポンスJSONでデータが無い時の表現 - きり丸の技術日記
- JavaでJSONを比較する(特定の項目を無視するやり方) - きり丸の技術日記
- JavaのJacksonライブラリのCsvMapperでCSVを読み込む - きり丸の技術日記
- LombokでToString.IncludeとExclude、callSuperで便利にログ出力する - きり丸の技術日記