Ich versuche, eine Methode in einer Dropwizard-Ressource zu implementieren, die einen Aufruf von einem JS-Frontend (das DataTables verwendet) bedient.Deserializing-Liste <Map <String, String >> QueryParam in Jersey 1
Die Anfrage hat Abfrageparameter, die wie folgt aussehen:
Spalten [0] [Daten] = 0 & Spalten [0] [name] = & Spalten [0] [durchsuchbare] = false & Spalten [0] [bestellbaren] = false & Spalten [0] [Suche] [Wert] = & Spalten [0] [Suche] [regex] = false
Spalten [1] [Daten] = iata & Spalten [1 ] [Name] = iata & Spalten [1] [durchsuchbar] = wahr & Spalten [1] [bestellbar] = wahr & Spalten [1] [Suche] [Wert] = & Spalten [1] [Suche] [regex] = false
Die Anforderung von einem JS-Frontend mit Datentabellen implementiert kommt, und verwendet serverseitige Verarbeitung. Info darüber, wie Datentabellen sendet die Anforderungen hier:
https://datatables.net/manual/server-side
Ich habe Probleme mit dem Datentyp für die oben genannten Abfrageparameter definieren. Mit Federdaten, können wir es als definieren:
List<Map<String, String>> columns
, die in einem Objekt gewickelt werden können mit ModelAttribute kommentiert und es wird deserialisieren in Ordnung.
In meiner App verwende ich eine ältere Version von Dropwizard, die auf Jersey 1.19 abhängt. Ich habe versucht, es als ein QueryParam kommentieren, aber die App schlägt beim Start fehl.
Methode:
@Path("/mappings")
@GET
@Timed
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response getMappings(@QueryParam("columns") List<Map<String, String>> columns) {
// processing here.
}
Wenn ich das tue, erhalte ich:
ERROR [2016.11.07 14: 16: 13.061] com.sun.jersey.spi.inject. Fehler: Die folgenden Fehler und Warnungen wurden mit Ressourcen und/oder Anbieterklassen erkannt: SCHWERE: Abhängigkeits für Methode Fehlende öffentlichen javax.ws.rs.core.Response com.ean.gds.proxy.ams.application. resource.gui.IataMappingGuiResource.getMappings (java.util.List) bei Parametern bei Index 0 WARN [2016.11.07 14: 16: 13.070] /: nicht verfügbar
Meiner Frage ist: Ich habe ich keine andere Wahl, als für sie einen benutzerdefinierten Deserializer schreiben?
Hinweis: Wenn ich die Anfrage mit @Context ergreife, kann ich sehen, dass die decodedQueryParams eine MultivaledMap sind, die String-Schlüssel wie "columns [0] [data]" Listen von String-Werten zuordnet, die immer einen einzigen haben Element, das ist der Wert.
Update: Nach einigem Graben fand ich die folgende JAX-RS-Spezifikation (Abschnitt 3.2), die erklärt, warum mein Ansatz nicht gültig beginnen:
Folgende Typen werden unterstützt:
Urtyp
Typen, die einen Konstruktor haben, die eine einzelne akzeptiert String-Argument
Typen, die eine statische Methode namens valueOf mit einem einzelnen String-Argument haben.
Liste, Set oder SortedSet wobei T 2 oder 3 erfüllt.
Quelle: Handling Multiple Query Parameters in Jersey
Also habe ich versucht, statt nur eine Liste mit. Dies stürzt die App beim Start nicht ab, aber wenn die Anfrage eingeht, wird sie in eine leere Liste deserialisiert. Es bleibt also die Frage, welcher Ansatz richtig ist.
Dies ist etwas, das Sie manuell analysieren müssen. Oder finde eine Bibliothek, die sie zu analysieren weiß. Jersey ist nicht schlau genug für diese –
Erlaubt Ihnen diese Client-Bibliothek nicht, die Daten im JSON-Format zu senden? Wenn Sie bei Abfrageparametern bleiben müssen, anstatt sie im Hauptteil zu senden, können Sie das JSON immer noch viel einfacher parsen, als Sie das aktuelle Format verwenden könnten. Ich weiß, dass die meisten JS Datat Bibliotheken erlauben JSON-Format –
@peeskillet Leider tut es nicht. Ich habe keine Kontrolle darüber, wie die Bibliothek diese Daten in der Anfrage sendet. Ich gehe derzeit nur für einen benutzerdefinierten Parser. Vielen Dank ! –