- JAVA
Jackson Cannot construct instanceの直し方
Cannot construct instance of ... (no Creators, like default constructor, exist) は、JSON から Java のオブジェクトを作るときに、Jackson がそのクラスの作り方(コンストラクタ)を見つけられなかったときの例外です。
エラー文の後半(: のあと)で、原因が分かります。
| エラー文の後半 | 原因 | 直し方 |
|---|---|---|
cannot deserialize from Object value (no delegate- or property-based Creator) |
引数なしのコンストラクタが無い(引数ありだけ) | @JsonCreator+@JsonProperty、引数なしのコンストラクタを足す、record にする |
non-static inner classes like this can only by instantiated using default, no-argument constructor |
static でない内部クラス | static を付ける |
abstract types either need to be mapped to concrete types, ... |
インターフェース・抽象クラスに変換しようとした | 具体的なクラスを指定する、型の情報を JSON に入れる |
(although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('a') |
リストの項目に文字列が来たなど、JSON の形が違う | JSON の形を確かめる |
確認環境:Jackson 2.14(jackson-databind 2.14.0、jackson-module-parameter-names 2.14.2)、OpenJDK 21 で再現しました(確認日 2026年10月11日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Jackson Cannot construct instanceの直し方」
原因① 引数なしのコンストラクタが無い(一番多い)
public static class NoDefault {
public final int id;
public final String name;
public NoDefault(int id, String name) { this.id = id; this.name = name; }
}
om.readValue("{\"id\":1,\"name\":\"a\"}", NoDefault.class);
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `N$NoDefault` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
jackson-annotations の README では、Jackson は既定で引数なしのコンストラクタを使ってオブジェクトを作り、別のコンストラクタを使うには @JsonCreator が必要と説明されています。 引数ありのコンストラクタしか無いと、どの引数に JSON のどの項目を入れればよいか分からず、この例外になりました。
| 直し方 | 書き方 | 結果 |
|---|---|---|
@JsonCreator と @JsonProperty |
コンストラクタと引数に付ける | WithCreator{1,a} |
| 引数なしのコンストラクタを足す | public WithDefault() {} |
WithDefault{1,a} |
| record にする(Java 16 以降) | public record UserRec(int id, String name) {} |
UserRec[id=1, name=a](何も付けずに動いた) |
ParameterNamesModule + javac -parameters |
下で説明 | NoDefault{1,a} |
public static class WithCreator {
public final int id;
public final String name;
@JsonCreator
public WithCreator(@JsonProperty("id") int id, @JsonProperty("name") String name) {
this.id = id; this.name = name;
}
}
final のフィールドを使い、不変のクラスにしたいときは、@JsonCreator か record が向いています。
ParameterNamesModule は -parameters が必要
| コンパイル | ParameterNamesModule を登録 | 結果 |
|---|---|---|
javac(指定なし) |
した | 同じ例外(no Creators) |
javac -parameters |
した | NoDefault{1,a} |
javac -parameters |
していない | 同じ例外 |
ParameterNamesModule は、コンパイルのときに -parameters を付けて、引数の名前を class ファイルに残したときだけ効きました。 「ある環境では動き、別の環境では動かない」ときは、ビルドの設定で -parameters が付いているかを確かめます。
原因② static でない内部クラス
public class N {
public class Inner { public int id; public Inner() {} } // static が無い
}
Cannot construct instance of `N$Inner`: non-static inner classes like this can only by instantiated using default, no-argument constructor
static でない内部クラスは、外側のクラスのオブジェクトが無いと作れないため、引数なしのコンストラクタを書いていても失敗しました。 JSON 用のクラスを別のクラスの中に書くときは、public static class にします。テストのコードで起きやすい形です。内部クラスの違いは、既存の記事「Java内部クラス・staticネスト・匿名クラスの違い比較表」で扱っています。
原因③ インターフェース・抽象クラス
Cannot construct instance of `N$Shape` (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
readValue(json, Shape.class) の Shape がインターフェースや抽象クラスだと、どの具体的なクラスを作ればよいか分かりません。 変換先には具体的なクラスを指定します。JSON によって作るクラスを変えたいときは、@JsonTypeInfo・@JsonSubTypes で JSON に型の情報を持たせる方法が、jackson-annotations の README で紹介されています。
原因④ JSON の形が違う(although at least one Creator exists)
| JSON | 変換先 | エラー文 |
|---|---|---|
{"tags":"a"} |
List<String> tags |
ArrayList について (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('a') |
{"code":"X1"} |
文字列1つのコンストラクタだけのクラス | ... (although at least one Creator exists): cannot deserialize from Object value ... |
although at least one Creator exists は「作り方はあるが、この形の JSON からは作れない」という意味です。リストのつもりが文字列1つ、オブジェクトのつもりが文字列、といった JSON の形の違いを確かめます。文字列1つのコンストラクタだけのクラスは、"X1" のような文字列の JSON からは作れました。
確認の手順(チェックリスト)
| 順番 | 確認すること | 方法 |
|---|---|---|
| 1 | エラー文の後半 | no delegate・non-static・abstract・although |
| 2 | 引数なしのコンストラクタがあるか | 無ければ @JsonCreator か record |
| 3 | 内部クラスに static があるか |
public static class |
| 4 | 変換先がインターフェース・抽象クラスでないか | 具体的なクラスに |
| 5 | JSON の形 | 配列か、オブジェクトか、文字列か |
| 6 | ParameterNamesModule を使うなら | -parameters でコンパイルしているか |
よくある質問
Q. Lombok の @Value や @AllArgsConstructor のクラスでも起きますか。 A. 引数ありのコンストラクタだけになる場合は、同じ原因で起きる可能性があります。Lombok が作るコードは、既存の記事「Lombokアノテーション一覧|展開後コードと使い分け早見表」で確かめられます。
Q. JSON に知らない項目があるときのエラーは。 A. 関連記事の「Jackson UnrecognizedPropertyExceptionの直し方」で扱っています。
まとめ
- JSON からオブジェクトを作る方法(コンストラクタ)が見つからない例外
- エラー文の後半で原因が分かる(no delegate・non-static・abstract・although)
- 引数ありだけのクラスは
@JsonCreator+@JsonPropertyか record - 内部クラスは
staticを付ける - ParameterNamesModule は
-parametersでコンパイルしたときだけ効く
参考・出典
確認日はいずれも 2026年10月11日です。
- FasterXML「jackson-annotations」README(@JsonCreator・@JsonTypeInfo):https://github.com/FasterXML/jackson-annotations
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「Jackson Cannot construct instanceの直し方」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。