Spring Boot视图POST请求无法到达Controller报400 BAD_REQUEST错误
问题原因
该400错误由SpringMVC参数绑定失败直接导致,核心问题出在Thymeleaf模板的隐藏域写法错误:
你当前写的隐藏域代码为:
<input type="hidden" id="id_injection" name="id_injection" value="${Inj.id_injection}">
原生HTML的value属性不会被Thymeleaf引擎解析,提交表单时传递的参数值是字面量字符串${Inj.id_injection},并非你预期的数字类型ID。后端Injection类的id_injection字段是int/Integer类型,Spring无法将非数字的字符串转换为整数类型,在参数绑定阶段就会抛出类型转换异常,直接返回400状态码,请求根本不会进入对应的控制器方法,因此修改@RequestMapping/@PostMapping注解无法解决问题。
如果修正模板写法后仍报错,可以额外排查两点:
Injection类是否提供了无参构造方法id_injection字段是否存在符合JavaBean命名规范的setter方法(即setId_injection,如果使用Lombok需要确认类上标注了@Data或@Setter注解)
可行解决方案
- 修正隐藏域的赋值写法,用Thymeleaf专属的
th:value属性替换原生value属性,让模板引擎正确读取并渲染变量值,修改后的表单代码如下:
<td> <form th:action="@{/delInj}" method="post"> <input type="hidden" id="id_injection" name="id_injection" th:value="${Inj.id_injection}"> <input class="btn btn-danger" type="submit" value="删除"> </form> </td>
- (可选优化)如果删除逻辑只需要用到记录ID,不需要绑定整个
Injection对象,可以直接将控制器方法参数改为基础类型,减少不必要的对象绑定,代码逻辑更清晰:
@PostMapping("/delInj") public ModelAndView delinject(@RequestParam("id_injection") Integer idInjection){ ModelAndView mv = new ModelAndView(); mv.setViewName("userOnly/MyInjections"); System.out.println("接收到的注射记录ID:" + idInjection); // 此处调用DAO层删除逻辑即可 return mv; }
注意:建议用包装类
Integer接收参数而非基本类型int,可以避免参数为空时触发空指针异常,也更方便后续做参数合法性校验。
内容的提问来源于stack exchange,提问作者Rune
相关产品推荐
相关产品推荐

