You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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注解)
可行解决方案
  1. 修正隐藏域的赋值写法,用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>
  1. (可选优化)如果删除逻辑只需要用到记录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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 00:01:18