Java 播放 - 使用 Map<String, AnotherObject> 绑定对象列表
Java Play - Binding a List of objects with a Map<String, AnotherObject> inside
我正在使用 Java Play 框架 2.6。我正在尝试提供对象列表(在本例中为章节)。每个章节对象都包含一个 Map 字段。以简单的方式说明这一点:
public class ListChapters {
private List<Chapter> formChapters;
public List<Chapter> getFormChapters() {
return formChapters;
}
public ListChapters setFormChapters(List<Chapter> formChapters) {
this.formChapters = formChapters;
return this;
}
}
public class Chapter {
private String name;
private Map<String, Material> materials;
public String getName() {
return name;
}
public Chapter setName(String name) {
this.name = name;
return this;
}
public Map<String, Material> getMaterials() {
return materials;
}
public Chapter setMaterials(Map<String, Material> materials) {
this.materials = materials;
return this;
}
}
public class Material {
private String code;
public String getCode() {
return code;
}
public Material setCode(String code) {
this.code = code;
return this;
}
}
在模板中,我用一些值填充输入框(每一章一行,地图中每个 material 字段一行):
@repeatWithIndex(formChapters("formChapters"), min=chapters.size() ) { (field, index) =>
<tr>
<td><input type="text" class="form-control" name="@{field.name}.name" value="@chapters.get(index).getName()">@chapters.get(index).getName()</td>
</tr>
@for((key, material) <- chapters.get(index).getMaterials()){
<tr>
<td><input type="text" class="form-control" name="@{field.name}.materials.@{material.getCode()}.code" value="@material.getCode()">@material.getCode()</td>
</tr>
}
}
章节和表单章节作为参数传递给模板:
chapters: List[Chapter], formChapters: Form[ListChapters]
现在 - 我苦苦思索了很长一段时间才弄清楚如何在提交时绑定表单,以获得正确的值。
绑定请求的代码非常简单:
Form<ListChapters> chaptersForm = formFactory.form(ListChapters.class).bindFromRequest();
List<Chapter> formChapters = chaptersForm.get().getFormChapters();
问题是 formChapters 正确地绑定了章节的名称 - 但是当涉及到 materials - 它们都是空的。
用Chrome检查,表单数据发送如下:
formChapters[0].name: Some name
formChapters[0].materials.19931.code: 19931
formChapters[1].name: Some other name
formChapters[1].materials.6311231.code: 6311231
...
这不是形成输入名称的正确方法,所以绑定完成了吗?或者可能是什么问题?
非常感谢任何帮助。
Play 框架表单请求绑定始终假定集合键(List、Map)将在方括号中提供。
表单数据应按如下方式发送:
formChapters[0].name: Some name
formChapters[0].materials[19931].code: 19931
formChapters[1].name: Some other name
formChapters[1].materials[6311231].code: 6311231
...
我正在使用 Java Play 框架 2.6。我正在尝试提供对象列表(在本例中为章节)。每个章节对象都包含一个 Map 字段。以简单的方式说明这一点:
public class ListChapters {
private List<Chapter> formChapters;
public List<Chapter> getFormChapters() {
return formChapters;
}
public ListChapters setFormChapters(List<Chapter> formChapters) {
this.formChapters = formChapters;
return this;
}
}
public class Chapter {
private String name;
private Map<String, Material> materials;
public String getName() {
return name;
}
public Chapter setName(String name) {
this.name = name;
return this;
}
public Map<String, Material> getMaterials() {
return materials;
}
public Chapter setMaterials(Map<String, Material> materials) {
this.materials = materials;
return this;
}
}
public class Material {
private String code;
public String getCode() {
return code;
}
public Material setCode(String code) {
this.code = code;
return this;
}
}
在模板中,我用一些值填充输入框(每一章一行,地图中每个 material 字段一行):
@repeatWithIndex(formChapters("formChapters"), min=chapters.size() ) { (field, index) =>
<tr>
<td><input type="text" class="form-control" name="@{field.name}.name" value="@chapters.get(index).getName()">@chapters.get(index).getName()</td>
</tr>
@for((key, material) <- chapters.get(index).getMaterials()){
<tr>
<td><input type="text" class="form-control" name="@{field.name}.materials.@{material.getCode()}.code" value="@material.getCode()">@material.getCode()</td>
</tr>
}
}
章节和表单章节作为参数传递给模板:
chapters: List[Chapter], formChapters: Form[ListChapters]
现在 - 我苦苦思索了很长一段时间才弄清楚如何在提交时绑定表单,以获得正确的值。
绑定请求的代码非常简单:
Form<ListChapters> chaptersForm = formFactory.form(ListChapters.class).bindFromRequest();
List<Chapter> formChapters = chaptersForm.get().getFormChapters();
问题是 formChapters 正确地绑定了章节的名称 - 但是当涉及到 materials - 它们都是空的。
用Chrome检查,表单数据发送如下:
formChapters[0].name: Some name
formChapters[0].materials.19931.code: 19931
formChapters[1].name: Some other name
formChapters[1].materials.6311231.code: 6311231
...
这不是形成输入名称的正确方法,所以绑定完成了吗?或者可能是什么问题?
非常感谢任何帮助。
Play 框架表单请求绑定始终假定集合键(List、Map)将在方括号中提供。
表单数据应按如下方式发送:
formChapters[0].name: Some name
formChapters[0].materials[19931].code: 19931
formChapters[1].name: Some other name
formChapters[1].materials[6311231].code: 6311231
...