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

Thymeleaf nested object form binding not generating good input name

我有以下对象结构:

public class A{

    private int id;
    private B objB;

    public A(){}

    --- setters & getters ---
}

这是我的 class 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

非常感谢任何帮助。

根据thymeleaf-spring docs

Values for th:object attributes in form tags must be variable expressions (${...}) specifying only the name of a model attribute, without property navigation. This means that an expression like ${seedStarter} is valid, but ${seedStarter.data} would not be.

尝试在表单前使用 th:with 属性来分配 A.objB 变量,因此避免在 th:object 中使用 属性 导航属性.

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

model.addAttribute("A", new A());

再添加一行:

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

请记住,使模型属性名称与您在问题中发布的提交请求处理程序的 @ModelAttribute 注释中设置的名称保持一致。

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

它看起来像这样,但在我的例子中提示是 Arraylist of contained objects here:

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