Jackson で Java のオブジェクトを JSON に書き出す(writeValueAsString)ときに出る、代表的な3つのエラーの直し方です。

エラー文 原因 直し方
No serializer found for class User and no properties discovered to create BeanSerializer JSON に書き出せる項目が1つも見つからない(private のフィールドだけで getter が無い) getter を付ける、@JsonAutoDetect、record
Java 8 date/time type ... not supported by default LocalDateTime などの日付の型を扱うモジュールが無い jackson-datatype-jsr310 を入れて JavaTimeModule を登録
Infinite recursion (StackOverflowError) 親と子がお互いを参照している(双方向の参照) @JsonManagedReference・@JsonBackReference、@JsonIgnore、返す専用のクラス

確認環境:Jackson 2.14(jackson-databind 2.14.0、jackson-datatype-jsr310 2.14.2)、OpenJDK 21 で再現しました(確認日 2026年10月11日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Jackson No serializer foundの直し方|日付・循環参照」

① No serializer found(書き出せる項目が無い)

public static class PrivNoGetter {
    private int id = 1;
    private String name = "a";
}
om.writeValueAsString(new PrivNoGetter());
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class Z$PrivNoGetter and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

Jackson は、既定では public の getter(と public のフィールド)から、書き出す項目を探します。 private のフィールドしか無いクラスでは、項目が1つも見つからず、この例外になりました。

直し方 結果
getter(getId()・getName())を付ける {"id":1,"name":"a"}
クラスに @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) {"id":1,"name":"a"}
SerializationFeature.FAIL_ON_EMPTY_BEANS を無効にする {}(中身が空)

要注意:エラー文の言うとおり FAIL_ON_EMPTY_BEANS を消すと、空の JSON になる

エラー文には「例外を避けるには FAIL_ON_EMPTY_BEANS を無効に」と書かれていますが、無効にすると、例外の代わりに {} が書き出されました。 画面や他のシステムに空のデータが渡り、原因に気づきにくくなります。項目を書き出したいなら getter を付けるのが正しい直し方です。

② Java 8 date/time type not supported by default(日付の型)

public static class Ev {
    public String title = "会議";
    public LocalDateTime at = LocalDateTime.of(2026, 10, 11, 9, 30);
    public LocalDate day = LocalDate.of(2026, 10, 11);
}
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: Z$Ev["at"])

エラー文のとおり、jackson-datatype-jsr310 を依存に入れて、JavaTimeModule を登録します。 読み込む(readValue)ときも、同じエラーになりました。

設定 書き出した JSON
モジュールなし 例外
JavaTimeModule を登録 {"title":"会議","at":[2026,10,11,9,30],"day":[2026,10,11]}(配列)
JavaTimeModule + WRITE_DATES_AS_TIMESTAMPS を無効 {"title":"会議","at":"2026-10-11T09:30:00","day":"2026-10-11"}
findAndRegisterModules() + WRITE_DATES_AS_TIMESTAMPS を無効 同上(クラスパスのモジュールを自動で登録)
ObjectMapper om = JsonMapper.builder()
        .addModule(new JavaTimeModule())
        .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
        .build();

モジュールを登録しただけでは、日付が [2026,10,11,9,30] という配列で書き出されました。 画面や他のシステムに渡すなら、WRITE_DATES_AS_TIMESTAMPS を無効にして、2026-10-11T09:30:00 の形にそろえます。日付の扱いは、既存の記事「Jackson ObjectMapperの使い方|JSON変換・日付・record」でも扱っています。

③ Infinite recursion(双方向の参照)

public static class Dept { public String name = "開発"; public List<Emp> members = new ArrayList<>(); }
public static class Emp  { public String name = "山田"; public Dept dept; }
// dept.members に emp を入れ、emp.dept に dept を入れた
om.writeValueAsString(dept);
com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: Z$Dept["members"]->java.util.ArrayList[0]->Z$Emp["dept"]->Z$Dept["members"]->java.util.ArrayList[0]->Z$Emp["dept"]->...

部署 → 社員 → 部署 → 社員 … と、お互いをたどって終わらなくなりました。 through reference chain に、同じ並び(Dept["members"] → Emp["dept"])が繰り返し出ていたら、この形です。JPA の @OneToMany・@ManyToOne のように、親と子がお互いを参照するエンティティを、そのまま JSON で返すと起きることがあります。

直し方 結果(確認環境)
親の側に @JsonManagedReference、子の側に @JsonBackReference {"name":"開発","members":[{"name":"山田"}]}(子から親は書き出されない)
子の dept に @JsonIgnore {"name":"開発","members":[{"name":"山田"}]}
返す専用のクラス(DTO・record)に詰め替える 必要な項目だけを返す

画面や API で返す項目は、エンティティそのものではなく、返す専用のクラスにすると、循環参照も、書き出したくない項目(パスワードのハッシュなど)の漏れも防げます。

確認の手順(チェックリスト)

順番 確認すること 方法
1 エラー文の種類 No serializer・date/time・Infinite recursion
2 No serializer なら getter があるか Lombok の @Getter の付け忘れも
3 FAIL_ON_EMPTY_BEANS を消していないか 消すと {} になる
4 日付なら jsr310 のモジュール 登録と WRITE_DATES_AS_TIMESTAMPS
5 Infinite recursion なら参照の向き through reference chain の繰り返し
6 エンティティをそのまま返していないか 返す専用のクラスにする

よくある質問

Q. 読み込むとき(JSON → Java)のエラーは。 A. 関連記事の「Jackson UnrecognizedPropertyExceptionの直し方」「Jackson Cannot construct instanceの直し方」で扱っています。

まとめ

  • No serializer found は、書き出せる項目(getter)が無い。getter を付ける
  • FAIL_ON_EMPTY_BEANS を無効にすると、例外の代わりに {} が出る
  • LocalDateTime は jackson-datatype-jsr310。WRITE_DATES_AS_TIMESTAMPS を無効にしないと配列になる
  • Infinite recursion は双方向の参照。@JsonManagedReference・@JsonBackReference か、返す専用のクラス

参考・出典

確認日はいずれも 2026年10月11日です。

  • FasterXML「jackson-annotations」README:https://github.com/FasterXML/jackson-annotations

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Jackson No serializer foundの直し方|日付・循環参照」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?