478 Stimmen

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

Ich erhalte die folgende Fehlermeldung, wenn ich versuche, eine JSON-Anfrage zu erhalten und zu verarbeiten:

org.codehaus.jackson.map.JsonMappingException: Kein passender Konstruktor für Typ [einfacher Typ, Klasse com.myweb.ApplesDO] gefunden: kann nicht aus 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;
    }
}

ÄpfelDO:

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 denke, 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 verursacht, wurde in die obige Beispielklasse aufgenommen - Bitte sehen Sie sich die akzeptierte Antwort für die Lösung an.

610voto

Lucky Murari Punkte 12302

Endlich habe ich erkannt, wo das Problem liegt. Es handelt sich nicht um ein Problem mit der Jackson-Konfiguration, wie ich bezweifelt hatte.

Das eigentliche Problem lag in ÄpfelDO 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 wurde 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() {
    }

}

393voto

azerafati Punkte 17199

Dies geschieht aus den folgenden Gründen:

  1. sollte Ihre innere Klasse wie folgt definiert sein statisch

    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 static class Condition {
        private Long id;
    
        public Condition() {
        }
    
        // Setters and Getters
    }
  3. Es könnte sein, dass Ihre Setter nicht richtig definiert oder nicht sichtbar sind (z.B. private Setter)

59voto

PiersyP Punkte 4713

Ich möchte eine weitere Lösung hinzufügen, die keinen Dummy-Konstruktor erfordert. Denn Dummy-Konstruktoren sind etwas unübersichtlich und verwirrend. Wir können einen sicheren Konstruktor bereitstellen und durch die Kommentierung der Konstruktorargumente erlauben wir Jackson, die Zuordnung zwischen Konstruktorparameter und Feld zu bestimmen.

also wird auch das Folgende funktionieren. Beachten Sie, dass die Zeichenfolge innerhalb der Anmerkung mit dem Feldnamen übereinstimmen muss.

import com.fasterxml.jackson.annotation.JsonProperty;
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 ApplesDO(@JsonProperty("apple")String apple) {
        }

}

31voto

jmarks Punkte 625

Als ich auf dieses Problem stieß, war es ein Ergebnis des Versuchs, eine innere Klasse als DO zu verwenden. Die Konstruktion der inneren Klasse (im Stillen) erforderte eine Instanz der umschließenden Klasse, die für Jackson nicht verfügbar war.

In diesem Fall wurde das Problem durch Verschieben der inneren Klasse in eine eigene .java-Datei behoben.

25voto

alok Punkte 2618

In der Regel tritt dieser Fehler auf, weil wir keinen Standardkonstruktor erstellen .
Aber in meinem Fall:
Das Problem trat nur auf, weil ich eine verwendete Objektklasse innerhalb der übergeordneten Klasse .
Das hat mir den ganzen Tag geraubt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X