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
...