You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Thymeleaf将Project对象传递给Java Spring Controller

问题核心原因

你当前的写法存在两处错误直接导致获取对象为null:

  1. HTML表单的input只能传递字符串类型的值,你直接将Project对象赋值给hidden输入框的value,Thymeleaf会自动调用该对象的toString()方法,最终提交到后端的只是对象的字符串表示,而非可直接强转的Java对象
  2. 表单提交的参数属于请求参数,你用WebRequest.getAttribute是从请求域属性中取值,二者是完全不同的存储位置,自然取不到值

推荐解决方案:表单字段绑定对象(最常用)

Spring MVC原生支持表单参数和Java对象的自动绑定,不需要手动序列化/反序列化,修改代码如下:

1. 前端HTML调整

不要把整个Project对象存在单个hidden输入框,将对象的每个属性对应单独的输入框,输入框的name属性和Project类的属性名保持一致:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Home</title>
    </head>
    <body>
        <form action="/addproject" method="POST">
            <!-- 示例中Project类有name、description两个属性,对应两个输入框 -->
            <input type="hidden" name="name" th:value="${project.name}"/>
            <input type="hidden" name="description" th:value="${project.description}"/>
            <input type="submit" value="Save Project" class="submit">
        </form>
    </body>
</html>

2. 后端Controller调整

用@ModelAttribute注解直接绑定接收Project对象:

@Controller
public class ProjectController {

    @GetMapping("/")
    public String indexPage(Model model) {
        model.addAttribute("project", new Project("Test", "Test"));
        return "index";
    }

    @PostMapping("/addproject")
    public String add(@ModelAttribute Project project) {
        // 此处的project已经完成属性赋值,可直接使用
        return "index";
    }
}

3. 补充注意事项

请确保你的Project类满足以下要求,否则参数绑定会失败:

  • 存在公开的无参构造方法
  • 每个需要绑定的属性都有对应的public getter、setter方法

可选方案:序列化传整个对象

如果你确实需要用单个参数传递整个对象,可以采用JSON序列化+反序列化的方式实现:

前端代码

<form action="/addproject" method="POST">
    <input type="hidden" name="projectJson" th:value="${#objectMapper.writeValueAsString(project)}"/>
    <input type="submit" value="Save Project" class="submit">
</form>

后端代码

@PostMapping("/addproject")
public String add(@RequestParam String projectJson, ObjectMapper objectMapper) throws JsonProcessingException {
    Project project = objectMapper.readValue(projectJson, Project.class);
    return "index";
}

内容的提问来源于stack exchange,提问作者Panzer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 12:15:02