miei dati JSON in arrivo request().body().asFormUrlEncoded().get("records")
Bind dati (JSON) forma complessa automaticamente
[{"string":"foo","termId":"793340"},{"string":"bar","termId":"460288"}]
La mia definizione del modulo:
public static class MyForm {
@Constraints.Required
public List<Map<String,String>> records;
public String someField;
}
Essa non vincola la records
automaticamente. Poi ho provato con un POJO invece:
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;
}
}
e adattato forma:
public static class MyForm {
@Constraints.Required
public List<Record> records;
public String someField;
}
non vincola i dati in automatico. Ho davvero bisogno di utilizzare API di basso livello come Jackson per questo semplice caso d'uso? Qualche puntatore? Impossibile trovare un esempio di copia/incolla, e da Jackson ho org.codehaus.jackson
e com.fasterxml.jackson
sul mio classpath.
AGGIORNAMENTO 2013-05-10: aggiunto un campo secondario someField
per chiarire che lo records
è solo un campo, non l'intera struttura dati. La risposta che segue (non riesco a vedere le risposte su questo schermo di modifica, quindi non importa, ce n'è solo una) funziona, ma solo con i record. Ecco un esempio:
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;
}
Per gli altri campi del modulo che faccio, come al solito:
Form<MyForm> form = play.data.Form.form(MyForm.class).bindFromRequest();
Così adesso riesco a tutti i dati del modulo distaccati, e il mio problema è risolto in questo modo (grazie !). Tuttavia, è un po 'brutto. Quello che non riesco ancora a capire è come avere tutti i dati dei post in un oggetto. Se qualcuno risponde a questo, aggiornerò la domanda e rimuoverò questa parte. Altrimenti accetterò l'unica risposta tra un paio di giorni.
Come scritto nella domanda: questo funziona. Non mi consente di combinare i miei "record" con altri valori di forma. E spero ancora che il gioco abbia o avrà in futuro una soluzione molto più semplice. –