JsonMappingException: Kein passender Konstruktor für Typ [einfacher Typ, Klasse ] gefunden: kann nicht aus JSON-Objekt instanziiert werden

Ich erhalte den folgenden Fehler, wenn ich versuche, eine JSON-Anforderung abzurufen und zu verarbeiten:

org.codehaus.jackson.map.JsonMappingException: Kein geeigneter Konstruktor für Typ [einfacher Typ, Klasse com.myweb.ApplesDO] gefunden: kann nicht von JSON-Objekt instanziiert werden (müssen Typinformationen hinzugefügt/aktiviert werden?)

Hier ist das JSON, das ich zu senden versuche:

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

Im Controller habe ich die folgende Methodensignatur:

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

AllApplesDO ist ein Wrapper von ApplesDO :

public class AllApplesDO {

    private List<ApplesDO> applesDO;

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

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

ApplesDO:

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
    }
}

Ich glaube, dass Jackson nicht in der Lage ist, JSON in Java-Objekte für Unterklassen zu konvertieren. Bitte helfen Sie mit den Konfigurationsparametern für Jackson, um JSON in Java-Objekte zu konvertieren. Ich verwende Spring Framework.

EDIT: Der Hauptfehler, der dieses Problem in der obigen Beispielklasse verursacht, wurde aufgenommen - bitte schauen Sie in der akzeptierten Antwort nach der Lösung.

Lösung

Jetzt habe ich endlich erkannt, was das Problem ist. Es ist kein Problem der Jackson-Konfiguration, wie ich bezweifelt hatte.

Eigentlich war das Problem in ApplesDO Klasse:

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
    }
}

Es war ein benutzerdefinierter Konstruktor für die Klasse definiert, der zum Standardkonstruktor wurde. Durch die Einführung eines Dummy-Konstruktors konnte der Fehler behoben werden:

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() {
    }

}
Kommentare (13)

Dies geschieht aus den folgenden Gründen:

  1. Ihre innere Klasse sollte als statisch definiert sein.

    private static class Condition { //jackson specific
    }
  2. Es könnte sein, dass Sie keinen Standardkonstruktor in Ihrer Klasse haben (UPDATE: Dies scheint nicht der Fall zu sein)

    private statische Klasse Condition {
        private Long id;
    
        public Condition() {
        }
    
        // Setter und Getter
    }
  3. Es könnte sein, dass Ihre Setter nicht richtig definiert oder nicht sichtbar sind (z. B. private Setter)

Kommentare (14)

Können Sie diese Struktur bitte testen. Wenn ich mich richtig erinnere, können Sie es auf diese Weise verwenden:

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

Zweitens, bitte fügen Sie jeder Klasse einen Standardkonstruktor hinzu, das könnte auch helfen.

Kommentare (4)