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.

5voto

Vortex Punkte 768

Wenn Sie mit der Kommentierung des Konstruktors beginnen, müssen Sie alle Felder mit Anmerkungen versehen.

Beachten Sie, dass mein Feld Staff.name in der JSON-Zeichenfolge auf "ANOTHER_NAME" abgebildet ist.

     String jsonInString="{\"ANOTHER_NAME\":\"John\",\"age\":\"17\"}";
     ObjectMapper mapper = new ObjectMapper();
     Staff obj = mapper.readValue(jsonInString, Staff.class);
     // print to screen

     public static class Staff {
       public String name;
       public Integer age;
       public Staff() {         
       }        

       //@JsonCreator - don't need this
       public Staff(@JsonProperty("ANOTHER_NAME") String   n,@JsonProperty("age") Integer a) {
        name=n;age=a;
       }        
    }

1voto

Akash Yellappa Punkte 1640

Hinzufügen von Standardkonstruktoren zu allen Entitätsklassen

0voto

Artem Novikov Punkte 3776

Fehlerhafte benutzerdefinierte Jackson Serializer/Deserializer könnten ebenfalls das Problem sein. Auch wenn es nicht Ihr Fall ist, ist es erwähnenswert.

Ich hatte die gleiche Ausnahme, und das war der Fall.

0voto

eis Punkte 48781

Bei mir hat das früher funktioniert, aber durch das Upgrade der Bibliotheken ist dieses Problem aufgetreten. Das Problem war, eine Klasse wie diese zu haben:

package example.counter;

import javax.validation.constraints.NotNull;

import lombok.Data;

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

    @NotNull
    private final Integer int2;
}

Lombok verwenden:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.0</version>
</dependency>

Rückfall auf

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.10</version>
</dependency>

Das Problem wurde behoben. Ich bin mir nicht sicher, warum, wollte es aber für die Zukunft dokumentieren.

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