Jersey, wie die POST eine Liste von JSON-Objekten?
Baue ich einen RESTful web-service in Java mit Jersey 1.11, und haben Probleme bei der Implementierung eine Methode, die verbraucht eine Liste von JSON-siert Personen. Die single-instance-Verfahren funktioniert.
Den Fehler den ich bekomme, ist:
Status 400 - Bad Request. The request sent by the client was syntactically incorrect.
Meiner Signatur der Methode sieht wie folgt aus:
@POST
@Path("/some-path/{someParam}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String createBatch(List<MyEntity> myEnts, @PathParam("someParam") String someParam)
{
...
}
JSON sende ich bei Anfragen ist ein array von MyEntity
JSON-Objekte:
[{"field1" : value1, "field2" : value2}, {"field1" : value3, "field2" : value4}, ...]
Ähnliche Frage gestellt, bevor, und ein straight forward Vorschlag war die änderung der verbrauchten Medien-Typ auf text-und de-serialisiert die JSON manuell aber ich würde lieber eine saubere Lösung.
Ist die JSON-ich schicke auch gilt in diesem Zusammenhang oder muss ich eine top-level - {}
ich.e eine wrapper-entity? Dies scheint auch ein bisschen un-Natürliche.
Danke,
/David
- Ich poste gleiche Antwort auf folgenden link .... stackoverflow.com/questions/13242414/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke PathParam und auch ein Param-das sollte unmarshallt von Jersey(JAX-RS) ist nicht möglich.
Bitte versuchen Sie, entfernen Sie die PathParam Parameter.
Und wenn Sie den zweiten Parameter so erstellen Sie eine neue Klasse, wie diese
und auch ändern Sie Ihre Methode :
Ihre JSON Sollte wie folgt Aussehen:
[{"field1" : value1, "field2" : value2}, {"field1" : value3, "field2" : value4}, ...]
entities
, Was Ausnahme ist gedruckt in deinem log? Weil Sie sagte, dass Sie eine 500-Fehlermeldung.entities
und meine Liste sieht wie folgt aus[entities:[ {"field1" : value1, "field2" : value2}, {"field1" : value3, "field2" : value4}, ...]
Ok, so dass ich am Ende lösten dieses Problem, indem eine einfache wrapper-Klasse, um zu generieren
{ items : [{ <myEnityInstanceJson1> }, { <myEnityInstanceJson2> }, ... ]}
. Ich denke, es ist ein Weg, um eine generische wrapper aber für jetzt, dies zu tun:Das problem ist die generische Liste-Art, die nicht zur Laufzeit aufgrund der type erasure, so dass Jersey nicht wissen, welche Art von POJOs zu unmarshal.
Ich denke, die einfachste Lösung (die ich kenne funktioniert, zumindest bei der Verwendung von Jackson in Ihrem
MessageBodyReader
) in diesem Fall wäre nur eine normale Java-array statt der Liste, also die Signatur der Methode wird:Und ja, die Kombination
@PathParam
und verbraucht/unmarshallt Körper-parameter sollte in Ordnung sein.Wrapper-Klasse arbeiten.
MyEntity[] myEnts
funktioniert nicht.Dies ist, was ich Tat und es funktionierte.
Verwenden
ObjectMapper
zu konvertieren, um Liste von Objekten.Diese gültig ist JSON für ein array:
(siehe hier für ein Beispiel)
Brauchen Sie nicht zu senden, die text, den Sie senden können, es als JSON. Auch Ihre
MyEntity
sollte@XmlRootElement
auf (siehe hier, Abschnitt 5.2 ein Beispiel).Brauchen Sie nicht
PathParam
in Ihre Argumente,someParam
ist verfügbar, wenn die Anfrage gepostet, wenn Sie verlassen die@Path("/some-path/{someParam}")
in deiner Signatur der Methode .