Mein Kommen JSON-Daten in request().body().asFormUrlEncoded().get("records")
Bind-Komplex (JSON) Formulardaten automatisch
[{"string":"foo","termId":"793340"},{"string":"bar","termId":"460288"}]
Meine Form Definition:
public static class MyForm {
@Constraints.Required
public List<Map<String,String>> records;
public String someField;
}
Es ist nicht die records
automatisch bindet. Dann habe ich versucht, mit einem POJO statt:
public static class Record {
public String string;
public String termId;
public void setString(String string) {
this.string = string;
}
public void setTermId(String termId) {
this.termId = termId;
}
}
und geeignet ist, die Form:
public static class MyForm {
@Constraints.Required
public List<Record> records;
public String someField;
}
Es werden die Daten nicht binden entweder automatisch. Muss ich wirklich Low-Level-APIs wie Jackson für diesen einfachen Anwendungsfall verwenden? Irgendein Zeiger? Konnte kein Beispiel zum Kopieren/Einfügen finden, und von jackson habe ich org.codehaus.jackson
und com.fasterxml.jackson
auf meinem Klassenpfad.
UPDATE 2013-05-10: hinzugefügt ein sekundäres Feld someField
um zu verdeutlichen, dass die records
ist nur ein Feld, nicht die gesamte Datenstruktur. Die Antwort unten von (Ich kann die Antworten auf diesen Bearbeitungsbildschirmen nicht sehen, also egal, es gibt nur eine) funktioniert, aber nur mit den Aufzeichnungen. Hier ein Beispiel:
private List<Record> recordsFromRequest() {
String[] jsonData = request().body().asFormUrlEncoded().get("records");
Form<Record> recordDummyForm = Form.form(Record.class);
Iterator<JsonNode> it = Json.parse(jsonData[0]).iterator();
List<Record> records = new ArrayList<>();
while (it.hasNext()) {
records.add(recordDummyForm.bind(it.next()).get());
}
return records;
}
Für die anderen Formularfelder ich, wie üblich:
Form<MyForm> form = play.data.Form.form(MyForm.class).bindFromRequest();
So jetzt komme ich auf alle Formulareingaben, und mein Problem gelöst wird auf diese Weise (dank !). Es ist jedoch ein bisschen hässlich. Was ich noch nicht herausfinden kann ist, wie man alle Daten in einem Objekt posten kann. Wenn jemand darauf antwortet, werde ich die Frage aktualisieren und diesen Teil entfernen. Ansonsten werde ich die einzelne Antwort in ein paar Tagen akzeptieren.
Wie in der Frage geschrieben: das funktioniert. Es lässt mich meine "Aufzeichnungen" nicht mit anderen Formwerten kombinieren. Und ich hoffe immer noch, dass das Spiel in Zukunft eine viel einfachere Lösung hat oder haben wird. –