如何通过Thymeleaf将Project对象传递给Java Spring Controller
问题核心原因
你当前的写法存在两处错误直接导致获取对象为null:
- HTML表单的input只能传递字符串类型的值,你直接将
Project对象赋值给hidden输入框的value,Thymeleaf会自动调用该对象的toString()方法,最终提交到后端的只是对象的字符串表示,而非可直接强转的Java对象 - 表单提交的参数属于请求参数,你用
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
相关产品推荐
相关产品推荐

