Java Spring Boot无法通过表单将Country对象保存至MySQL数据库问题求助
先给你说最可能导致问题的两个核心点,改完大概率就能解决:
1. 控制器方法的访问修饰符错误
你的CountryController里的两个请求处理方法都是private的:
@GetMapping("/countries") private String getListOfCountries(Model model) { ... } @PostMapping("/countries/addNew") private String addNewCountry(...) { ... }
Spring MVC根本无法识别并调用private的控制器方法,必须把它们改成public,这是最关键的问题!修改后代码如下:
@GetMapping("/countries") public String getListOfCountries(Model model) { ... } @PostMapping("/countries/addNew") public String addNewCountry(...) { ... }
2. 模态框提交按钮的data-dismiss属性干扰提交
你的表单提交按钮上带了data-dismiss="modal":
<button type="submit" class="btn btn-primary" data-dismiss="modal">Add</button>
这个属性会在点击按钮时立即关闭模态框,大概率导致表单还没完成提交流程就被中断了。直接去掉这个属性就行:
<button type="submit" class="btn btn-primary">Add</button>
如果需要提交后再关闭模态框,可以后续用JavaScript实现提交成功后的关闭逻辑。
其他排查建议(如果上面修改后仍有问题)
简化参数绑定,用
@ModelAttribute替代多个@RequestParam:
直接把请求参数绑定到Country对象,既简洁又能避免参数名匹配错误,前提是你实体类的getter/setter都正确生成了:@PostMapping("/countries/addNew") public String addNewCountry(@ModelAttribute Country country) { countryService.addNewCountry(country); return "redirect:/countries"; }你的前端表单
name属性已经和实体类字段一致,这样可以直接完成绑定。开启请求日志排查请求流向:
在application.properties里添加日志配置,观察请求是否真的到达了控制器,参数是否正确传递:logging.level.org.springframework.web=DEBUG启动应用后看控制台日志,确认
POST /countries/addNew请求是否被处理,参数有没有正确接收。检查CSRF令牌:
Thymeleaf配合Spring MVC时会自动给th:action的表单添加CSRF令牌隐藏字段,你可以渲染页面后查看源码,确认是否有类似<input type="hidden" name="_csrf" value="...">的字段。如果没有,可暂时关闭CSRF测试(仅用于排查,生产环境禁止这么做):@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); } }
内容的提问来源于stack exchange,提问作者Bogdan Mazur

