SpringBoot Thymeleaf表单向Controller传递null值问题求助
SpringBoot Thymeleaf表单向Controller传值为null的问题解决
问题现象
表单包含姓氏(last name)和名字(first name)输入框,但提交后在Controller中调用authorRequest.getLastName()或authorRequest.getFirstName()始终返回null。
问题根源分析
Thymeleaf字段绑定与JavaBean属性不匹配
Thymeleaf的th:field依赖JavaBean规范识别属性名:通过getter方法推导属性名,getLastName()对应的属性名是lastName,而非私有字段的__lastName。直接绑定私有字段名会导致映射失败。Author类缺少setter方法
Spring MVC绑定模型属性时,需要通过setter方法将表单值注入对象。你的Author类仅提供getter,没有对应setter,无法完成值的注入。Controller存在重复请求映射
定义了两个@GetMapping("/booktown/list")方法,一个返回List<Author>,另一个返回视图页面,会导致请求匹配混乱,影响页面渲染和模型属性传递。
修复步骤
1. 修正Thymeleaf表单的字段绑定
将表单中的th:field改为对应JavaBean属性名:
<form action="#" th:action="@{/booktown/add}" th:object="${authorRequest}" method="post"> <p>姓氏: <input type="text" th:field="*{lastName}" /></p> <p>名字: <input type="text" th:field="*{firstName}" /></p> <p><input type="submit" value="提交" /> <input type="reset" value="重置" /></p> </form>
2. 给Author类添加setter方法
补充lastName和firstName对应的setter,让Spring MVC能注入值:
package com.booktown.booktownservice; public class Author { public Author(){} public Author(int id, String lname, String fname) { __id = id; __lastName = lname; __firstName = fname; } public int getAuthorID() { return __id; } public String getLastName() { return __lastName; } public String getFirstName() { return __firstName; } // 新增setter方法 public void setLastName(String lastName) { this.__lastName = lastName; } public void setFirstName(String firstName) { this.__firstName = firstName; } public int get__id() { return __id; } public String get__lastName() { return __lastName; } public String get__firstName() { return __firstName; } private int __id; private String __lastName; private String __firstName; }
3. 清理重复的Controller映射
删除返回List<Author>的@GetMapping("/booktown/list")方法,保留返回视图的版本:
@Controller public class AuthorController { private BooktownService __authorService = BooktownServiceFactory.getInstance(); private String msg = ""; // 删除此重复方法 // @GetMapping("/booktown/list") // public List<Author> returnAuthors() { // return __authorService.getAuthors(); // } @GetMapping("/booktown/list") public String returnAuthors(Model model) { Author auth= new Author(); List<Author> auths = __authorService.getAuthors(); if(msg.isEmpty()){ msg = "作者列表页面"; } model.addAttribute("authors", auths); model.addAttribute("authorRequest", auth); model.addAttribute("msg",msg); return "list_form"; } @PostMapping("/booktown/add") public String createAuthor(@ModelAttribute("authorRequest") Author authorRequest) { __authorService.createAuthor(authorRequest.getLastName(), authorRequest.getFirstName()); msg = "已添加作者: " + authorRequest.getFirstName() + " " + authorRequest.getLastName(); return "redirect:/booktown/list"; } @GetMapping("/booktown/delete") public String deleteAuthor(@RequestParam Integer id) { __authorService.deleteAuthor(id); msg = "已删除作者ID: " + id; System.out.println("deleted"); return "redirect:/booktown/list"; } }
额外优化建议
- 不要将
Model作为Controller的成员变量,直接使用方法参数中的Model即可,避免多线程环境下的安全问题。 - 判断字符串为空时,优先使用
isEmpty()方法,而非== "",更符合Java编码规范。
内容的提问来源于stack exchange,提问作者Lot Channel
相关产品推荐
相关产品推荐

