Spring Boot整合Thymeleaf时movieDTO缺失、重定向路径失效问题求助
问题1:访问/addMovie报错、movieDTO接收值为空的原因
触发问题有三个核心原因:
- 表单渲染时缺少绑定对象
/addMovie接口直接返回视图,没有往Model中存入名为movieDTO的空对象,Thymeleaf渲染表单时读取th:object="${movieDTO}"找不到对应的绑定属性,直接抛出异常。 MovieDTO缺少无参构造函数
Spring MVC通过反射实例化DTO完成参数绑定,必须依赖无参构造方法。当前MovieDTO仅定义了全参构造,Spring无法完成对象实例化,就算表单可以正常提交,也没法注入参数,拿到的自然是空值。- 参数校验顺序错误
create方法中BindingResult参数没有紧跟被@Valid注解修饰的movieDTO,Spring不会把校验结果存入当前BindingResult对象,参数校验逻辑不生效。
修复代码
修改/addMovie接口,存入空绑定对象:
@RequestMapping("/addMovie") public String add(Model model) { model.addAttribute("movieDTO", new MovieDTO()); return "movie/movie-add"; }
给MovieDTO补充无参构造函数:
public MovieDTO() { }
调整create方法参数顺序:
@RequestMapping(value = "/saveMovie", method = RequestMethod.POST) public String create(@ModelAttribute("movieDTO") @Valid MovieDTO movieDTO, BindingResult result, Model model) { // 原有逻辑不变 }
问题2:重定向无法识别movies-all路径的原因
触发问题有两个核心原因:
- 重定向路径使用了相对路径,当前写法
redirect:movie/movies-all是相对请求路径/saveMovie解析的,最终会被解析为/saveMovie/movie/movies-all,和预期路径不符。 - 混淆了视图路径和请求路径:
redirect:后面跟的是后端请求接口路径,不是视图文件的存储路径,需要先定义对应接口映射返回movies-all视图,再重定向到这个接口的路径。
修复代码
先新增全量电影列表的请求映射:
@RequestMapping("/movies-all") public String listAll(Model model) { movieService.showMovies(model); return "movie/movies-all"; }
修改重定向写法为绝对路径:
// 替换原有重定向代码 return "redirect:/movies-all";
内容的提问来源于stack exchange,提问作者Nexx
相关产品推荐
相关产品推荐

