【问题标题】:Java Play - Binding a List of objects with a Map<String, AnotherObject> insideJava Play - 使用 Map<String, AnotherObject> 绑定对象列表
【发布时间】:2019-08-27 08:26:02
【问题描述】:

我正在使用 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;
    }
}

在模板中,我用一些值填充输入框(每章一行,地图中每个材料字段一行):

@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>
    }
}

章节和表单章节作为参数传递给模板:

章节:列表[章节],表单章节:表单[列表章节]

现在 - 我正在努力弄清楚如何在提交时绑定表单以获得正确的值。

绑定请求的代码非常简单:

Form<ListChapters> chaptersForm = formFactory.form(ListChapters.class).bindFromRequest();
List<Chapter> formChapters = chaptersForm.get().getFormChapters();

问题在于 formChapters 正确地绑定了章节的名称 - 但是当涉及到材料时 - 它们都是空的。
用 Chrome 检查,表单数据发送如下:

formChapters[0].name: Some name
formChapters[0].materials.19931.code: 19931
formChapters[1].name: Some other name
formChapters[1].materials.6311231.code: 6311231
...

这不是形成输入名称的正确方法,所以绑定完成了吗?或者可能是什么问题?

非常感谢任何帮助。

【问题讨论】:

    标签: java data-binding playframework


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-11-17
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2021-06-11
      • 2015-08-30
      • 2018-11-22
      相关资源
      最近更新 更多