JsonMappingException: Kein passender Konstruktor gefunden, geben Sie [einfache Art, Klasse ]: kann nicht instanziiert, die aus JSON-Objekt
Ich erhalte die folgende Fehlermeldung, wenn Sie versuchen, um eine JSON-Anforderung und Prozess:
org.codehaus.jackson.Karte.JsonMappingException: Kein passender Konstruktor gefunden, geben Sie [einfache Art, Klasse com.Oneview.ApplesDO]: kann nicht instanziiert, die aus JSON-Objekt (hinzufügen/aktivieren geben Sie die Informationen?)
Hier ist die JSON-ich bin versucht zu senden:
{
"applesDO" : [
{
"apple" : "Green Apple"
},
{
"apple" : "Red Apple"
}
]
}
Controller, ich habe die folgende Methodensignatur:
@RequestMapping("showApples.do")
public String getApples(@RequestBody final AllApplesDO applesRequest){
//Method Code
}
AllApplesDO ist ein wrapper der 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
}
}
Denke ich, dass Jackson nicht in der Lage ist, zu konvertieren von JSON in Java-Objekte für Unterklassen. Bitte helfen Sie mit der Konfiguration der Parameter für Jackson zum konvertieren von JSON in Java-Objekte. Ich bin mit Spring Framework.
EDIT: das große Fehler, der dieses problem verursacht, in dem obigen Beispiel die Klasse - Bitte schauen Sie akzeptierten Antworten für die Lösung.
InformationsquelleAutor der Frage Lucky Murari | 2011-10-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, endlich habe ich verstanden, was das problem ist. Es ist nicht ein Jackson-Konfigurations-Problem, als ich zweifelte.
Eigentlich das problem war in ApplesDO Klasse:
Gab es einen custom-Konstruktor der Klasse machen es den default-Konstruktor. Die Einführung einer dummy-Konstruktor hat den Fehler gemacht Weg zu gehen:
InformationsquelleAutor der Antwort Lucky Murari
Dies geschieht, aus diesen Gründen:
Ihre innere Klasse definiert werden sollte, wie statische
Könnte es sein, dass du hast keinen default-Konstruktor in Ihrer Klasse (UPDATE: Dies scheint nicht der Fall zu sein)
Könnte es sein, Ihre Setter sind nicht richtig definiert oder nicht sichtbar sind (z.B. private setter)
InformationsquelleAutor der Antwort azerafati
Ich möchte noch eine weitere Lösung, die nicht erfordert eine dummy-Konstruktor. Da dummy-Konstruktoren sind ein bisschen chaotisch und anschließend verwirrend. Wir können Ihnen eine sichere Konstruktor und durch kommentieren der Konstruktor Argumente, die wir erlauben, jackson, bestimmen die Zuordnung zwischen parameter des Konstruktors und Feld.
also Folgendes funktioniert auch. Hinweis: die Zeichenfolge innerhalb der annotation muss mit dem Feld name.
InformationsquelleAutor der Antwort PiersyP
Wenn ich lief in dieses problem, es war das Ergebnis von versuchen, zu verwenden eine innere Klasse zu dienen, wie Sie das TUN. Der Bau der inneren Klasse (still) erforderlich, eine Instanz der umschließenden Klasse-die war nicht verfügbar, um Jackson.
In diesem Fall, bewegen Sie den inneren Klasse zu seinen eigenen .java-Datei das problem behoben.
InformationsquelleAutor der Antwort jmarks
Kannst du bitte testen Sie diese Struktur. Wenn ich mich korrigieren, Sie können es verwenden, auf diese Weise:
Sekunde, bitte add default-Konstruktor jeder Klasse, könnte auch helfen.
InformationsquelleAutor der Antwort danny.lesnik
Daumenregel: Fügen Sie eine default-Konstruktor für jede Klasse, die Sie als eine mapping-Klasse. Sie verpasste dieses und Problem auftauchen!
Einfach add default-Konstruktor und es sollte funktionieren.
InformationsquelleAutor der Antwort Badal
Erstellen Sie dummy-Konstruktor in unsere model-Klasse.Während also das mapping von json, festgelegt durch setter-Methode.
InformationsquelleAutor der Antwort Suresh Patil
Wenn Sie beginnen, hinzufügen von Anmerkungen Konstruktor, müssen Sie kommentieren alle Felder.
Hinweis, meine Mitarbeiter.Feld name zugeordnet ist "ANOTHER_NAME" in der JSON-string.
InformationsquelleAutor der Antwort Vortex
Müssen Sie erkennen, welche Optionen Jackson hat für die Deserialisierung. In Java-Methode argument-Namen sind nicht in den kompilierten code. Das ist, warum Jackson nicht in der Regel verwenden Sie Konstruktoren, um erstellen Sie eine gut definierte Objekt mit der alles bereits festgelegt ist.
Also, wenn es einen leeren Konstruktor und gibt es auch setter, es wird die leere Konstruktor und setter. Wenn es keine setter, einige dunkle Magie (Reflexionen) wird verwendet, um es zu tun.
Wenn Sie möchten, verwenden Sie einen Konstruktor mit Jackson, müssen Sie die Anmerkungen wie erwähnt von @PiersyP in seiner Antwort. Sie können auch ein builder pattern. Wenn Sie Begegnung einige Ausnahmen, zum Glück. Fehlerbehandlung in Jackson saugt große Zeit, es ist schwer zu verstehen, dass nichtssagenden Fehlermeldungen.
InformationsquelleAutor der Antwort Vlasec
In der Regel kommt dieser Fehler, weil wir keinen Standard-Konstruktor, sondern in meinem Fall Das Problem kam nur durch die ich gemacht habe verwendet Objekt-Klasse in übergeordneten Klasse. Dies verschwendet hat mir den ganzen Tag.
InformationsquelleAutor der Antwort alok
Fehlerhaften custom jackson Serialisierungsprogramme/Deserializers könnte auch das problem sein. Obwohl es nicht Ihr Fall, es ist erwähnenswert.
Stand ich vor der gleichen Ausnahme und das war der Fall.
InformationsquelleAutor der Antwort Artem Novikov
Für mich, dies funktionierte, aber aktualisieren von Bibliotheken verursacht dieses Problem zu erscheinen. Problem war, dass eine Klasse wie folgt aus:
Mit lombok:
Wieder fallen zu
Wurde das Problem behoben. Nicht sicher, warum, aber wollte es dokumentiert für die Zukunft.
InformationsquelleAutor der Antwort eis