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.

13voto

Badal Punkte 3850

Daumenregel : Fügen Sie für jede Klasse, die Sie als Abbildungsklasse verwenden, einen Standardkonstruktor hinzu. Sie haben dies übersehen und ein Problem entsteht!
Fügen Sie einfach den Standardkonstruktor hinzu und es sollte funktionieren.

10voto

danny.lesnik Punkte 18305

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, fügen Sie bitte Standard-Konstruktor zu jeder Klasse könnte es auch helfen.

8voto

Suresh Patil Punkte 121

Sie müssen einen leeren Dummy-Konstruktor in unserer Modellklasse erstellen, der beim Mapping von json durch die Setter-Methode festgelegt wird.

6voto

Felipe Ceballos Punkte 61

In Bezug auf die letzte Veröffentlichung hatte ich das gleiche Problem, bei dem die Verwendung von Lombok 1.18.* das Problem verursachte.

Meine Lösung war, @NoArgsConstructor (Konstruktor ohne Parameter) hinzuzufügen, da @Data standardmäßig @RequiredArgsConstructor (Konstruktor mit Parametern) enthält.

lombok Dokumentation https://projectlombok.org/features/all

Damit wäre das Problem gelöst:

package example.counter;

import javax.validation.constraints.NotNull;

import lombok.Data;

@Data
@NoArgsConstructor
public class CounterRequest {
    @NotNull
    private final Integer int1;

    @NotNull
    private final Integer int2;
}

5voto

Vlasec Punkte 5291

Sie müssen wissen, welche Optionen Jackson für die Deserialisierung zur Verfügung stehen. In Java sind die Namen der Methodenargumente im kompilierten Code nicht vorhanden. Deshalb kann Jackson im Allgemeinen keine Konstruktoren verwenden, um ein wohldefiniertes Objekt zu erstellen, bei dem bereits alles festgelegt ist.

Wenn also ein leerer Konstruktor vorhanden ist und es auch Setter gibt, werden der leere Konstruktor und die Setter verwendet. Wenn es keine Setzer gibt, wird dafür dunkle Magie (Reflexionen) verwendet.

Wenn Sie einen Konstruktor mit Jackson verwenden möchten, müssen Sie die von @PiersyP in seiner Antwort erwähnten Anmerkungen verwenden. Sie können auch ein Builder-Muster verwenden. Wenn Sie auf Ausnahmen stoßen, viel Glück. Die Fehlerbehandlung in Jackson ist sehr schlecht, es ist schwer, das Kauderwelsch in Fehlermeldungen zu verstehen.

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