Thymeleaf嵌套对象表单绑定不生成良好的输入名称

时间:2015-09-11 14:15:35

标签: spring spring-mvc thymeleaf

我有以下对象结构:

public class A{

    private int id;
    private B objB;

    public A(){}

    --- setters & getters ---
}

这是我的班级B:

public class B{

    private int id;
    private int test;

    public B(){}

    --- setters & getters ---
}

我将一个A对象传递给我的视图,我想为我的B对象创建一个表单:

<form id="bForm" th:object=${A.objB} th:action="@{/save}">
    <input th:field=*{test} type="text"/>
</form>

但是上面的代码会起作用,它会生成如下的输入名称:objB.test为此我的控制器无法将它绑定到B对象。

这是我控制器中的接收方法:

    @RequestMapping("/save")
    @ResponseBody
    public String setB(@ModelAttribute("bForm") B b, BindingResult result) {
        aService.setB(b);
        return "...";
    }

如何设置Thymeleaf为我的字段命名而不添加前缀,而不是:objB.test只是test

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

根据thymeleaf-spring docs

  

表单标记中${...}属性的值必须是变量表达式(${seedStarter}),仅指定模型属性的名称,不带属性导航。这意味着像${seedStarter.data}这样的表达式有效,但th:with不会。

尝试在表单前使用A.objB属性来分配th:object变量,从而避免在model.addAttribute("A", new A()); 属性中使用属性导航。

似乎要遵守这个要求,你必须在Spring控制器的处理初始表单呈现的处理程序方法中设置一个额外的模型属性。因此,鉴于您的代码的某些部分已经有类似的内容:

model.addAttribute("bForm", new B());

添加另一行:

@ModelAttribute

请注意,保留模型属性名称与您在提交请求处理程序中t.test(sam.a,sam.b, var.equal = TRUE)$p.value #[1] 0.01819264 注释中设置的名称一致。

答案 1 :(得分:0)

也许是一个迟到的答案,但如果objectB是A的内部对象,那么你可以将字段绑定到B作为A的内部对象并处理控制器中的objectA。

它看起来像这样,但在我的情况下,提示符是包含对象的Arraylist:

    <th:block th:each="pr, stat : ${taskExecution.prompt}">
      <input type="hidden" id="hiddenName" th:field="*{prompt[__${stat.index}__].name}" th:value="${pr.name}">
      <input type="hidden" id="hiddenValue" th:field="*{prompt[__${stat.index}__].value}" th:value="${pr.value}">
    </th:block>