- JAVA
Jackson No serializer foundの直し方|日付・循環参照
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期連続の黒字決算。