spring - Thymeleaf 嵌套对象表单绑定(bind)未生成良好的输入名称

标签 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 对象传递给我的 View ,我想为我的 B 对象创建一个表单:

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

但是上面的代码可以工作,它会生成这样的输入名称:objB.test 为此,我的 Controller 无法将它绑定(bind)到 B 对象。

这是我 Controller 中的接收方法:

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

我如何设置 Thymeleaf 以不带前缀的方式命名我的字段,而不是:objB.test just 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 Controller 的处理程序方法中设置一个额外的模型属性。因此,假设您的代码的某些部分已经有这样的内容:

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

再添加一行:

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

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

关于spring - Thymeleaf 嵌套对象表单绑定(bind)未生成良好的输入名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32525601/

相关文章:

java - Bean 未注入(inject) jUnit 测试

java - Thymeleaf 启动时出错

java - Thymeleaf,片段和默认参数

java - 如何创建带有参数的Spring Bean(数据源)?

java - Spring MVC @RequestMapping 参数问题

spring - 从 Spring 2.5.5 升级到 Spring 3 时 Spring mvc 的问题

java - 带 IOC 的 Spring REST 服务?

将 Thymeleaf 文件设为动态页面时,Javascript 无法在 Thymeleaf 文件中工作

java - 如何通过休息调用使用输入表单获取数据?

spring - applicationcontext.xml 和 .hbm 文件放在哪里?