Jersey: Kein passender Konstruktor für type gefunden [einfacher Typ, Klasse Thing]: kann nicht vom JSON-Objekt instanziiert werden
Habe ich eine Ressource mit einer Methode wie:
@PUT
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/add")
public Response putThing(Thing thing) {
try {
//Do something with Thing object
return Response.status(HttpStatus.SC_OK).build();
} catch (Exception e) {
log.error("Request failed", e);
return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).build();
}
}
Sache:
public class Thing {
private final String symbol;
private final String name;
public Stock(String symbol, String name) {
this.symbol = symbol;
this.name = name;
}
public String getSymbol() {
return this.symbol;
}
public String getName() {
return this.name;
}
}
Wenn ich eine PUT-Anfrage wie:
PUT /rest/add HTTP/1.1
Host: localhost:8135
Content-Type: application/json
Cache-Control: no-cache
{"symbol":"some symbol","name":"some name"}
Bekomme ich die folgende Antwort:
Kein passender Konstruktor gefunden, geben Sie [einfache Art, Klasse Sache]: können
nicht instanziieren von JSON-Objekt (fehlende Standard-Konstruktor oder
Schöpfer, oder vielleicht hinzufügen/aktivieren geben Sie die Informationen?)
Warum ist Jersey/Jackson nicht Deserialisieren meine JSON-Objekt in mein POJO?
InformationsquelleAutor der Frage Edd | 2015-06-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie eine no-arg-Konstruktor und setter, oder verwenden Sie
@JsonCreator
. Die einfachste Sache zu tun wäre, nur um den no-arg-mit-setter. Jackson braucht der setter beim Deserialisieren. Für die Serialisierung, alle, die erforderlich sind Getter.BEARBEITEN
Zu halten, unveränderlich, können Sie
@JsonCreator
auf den Konstruktor. Zum BeispielMehr sehen Jackson Anmerkungen: @JsonCreator entmystifiziert
InformationsquelleAutor der Antwort Paul Samsotha
Bin mir absolut nicht positiv, aber ich denke, das ist es.
Den Weg, dass Jackson arbeiten will, ist dies: es wird das Objekt mit den Standardeinstellungen (kein argument) - Konstruktor. Dann ist es setter verwendet, um jede der Instanz-Variablen. Dies mag den langen Weg, aber es ist wirklich der einzige Weg, denn Jackson ist nicht wirklich schlau genug, um herauszufinden, was zum bestehen der Konstruktor-Parameter. Also dein code hat zwei Haupt-Probleme (na ja, drei, aber ich gehe davon aus, dass Ihre Klasse genannt wurde Lager, bevor Sie zumeist gereinigt es bis zum posten 😉 ).
1. Sie brauchen einen no-argument-Konstruktor. Was weiß ich, java stellt einen Standard-Konstruktor, wenn Sie nicht schreiben, aber sobald Sie nur einen Konstruktor, der die default-no-argument-Konstruktor geht Weg.
2. Sie benötigen setter für die Instanz-Variablen (und öffentlich zu machen ist nicht gut genug, Sie haben tatsächlichen setter). Oh, es sieht aus wie Ihre Instanz-Variablen sind Endpreise, das ist nicht zur Arbeit gehen. Meine Lieblings-Weg zu verwalten, die copy/Paste-setter ist die Verwendung einer Bibliothek namens lombok. Sowieso, jetzt müssen Sie nur diesen setter.
InformationsquelleAutor der Antwort OrigamiMarie