1. ホーム
  2. java

[解決済み] JsonMappingException: No suitable constructor found for type [simple type, class ]: can't instantiate from JSON object.

2022-01-27 16:18:31

質問

JSONリクエストを取得して処理しようとすると、以下のエラーが発生します。

org.codehaus.jackson.map.JsonMappingException: No suitable constructor found for type [simple type, class com.myweb.ApplesDO]: can't instantiate from JSON object (need to add/enable type information?).

以下は、私が送信しようとしているJSONです。

{
  "applesDO" : [
    {
      "apple" : "Green Apple"
    },
    {
      "apple" : "Red Apple"
    }
  ]
}

Controllerでは、以下のようなメソッドシグネチャを持っています。

@RequestMapping("showApples.do")
public String getApples(@RequestBody final AllApplesDO applesRequest){
    // Method Code
}

AllApplesDOは、ApplesDOのラッパーです。

public class AllApplesDO {

    private List<ApplesDO> applesDO;

    public List<ApplesDO> getApplesDO() {
        return applesDO;
    }

    public void setApplesDO(List<ApplesDO> applesDO) {
        this.applesDO = applesDO;
    }
}

りんごDO。

public class ApplesDO {

    private String apple;

    public String getApple() {
        return apple;
    }

    public void setApple(String appl) {
        this.apple = apple;
    }

    public ApplesDO(CustomType custom){
        //constructor Code
    }
}

Jacksonでは、サブクラスのJSONをJavaオブジェクトに変換できないようです。JacksonがJSONをJavaオブジェクトに変換するための構成パラメータについて、ご教授ください。私はSpring Frameworkを使用しています。

EDIT: 上記のサンプルクラスでこの問題を引き起こしている主要なバグを含んでいます - 解決のために受理された答えをご覧ください。

解決方法は?

で、ようやく問題の正体に気がつきました。私が疑っていたように、ジャクソンの設定の問題ではありません。

実は、この問題は りんごDO クラスです。

public class ApplesDO {

    private String apple;

    public String getApple() {
        return apple;
    }

    public void setApple(String apple) {
        this.apple = apple;
    }

    public ApplesDO(CustomType custom) {
        //constructor Code
    }
}

このクラスにはカスタムコンストラクタが定義されており、それがデフォルトコンストラクタになっていました。ダミーのコンストラクタを導入することで、このエラーを解消することができました。

public class ApplesDO {

    private String apple;

    public String getApple() {
        return apple;
    }

    public void setApple(String apple) {
        this.apple = apple;
    }

    public ApplesDO(CustomType custom) {
        //constructor Code
    }

    //Introducing the dummy constructor
    public ApplesDO() {
    }

}