Spring Boot REST API加@Valid注解传合法数据仍返回400错误
问题根因
你遇到的400错误来自两个代码层面的错误,和参数校验逻辑本身无关:
@RequestBody注解导错包:你当前导入的是io.swagger.v3.oas.annotations.parameters.RequestBody,这是Swagger/OpenAPI用来生成接口文档的注解,完全不具备HTTP请求体绑定的功能。加上@Valid注解触发参数校验时,Spring无法找到要绑定、校验的请求体对象,直接抛出参数异常返回400。- 请求方法使用不符合规范:当前接口使用
@GetMapping声明,HTTP GET方法定位是资源查询,按照RFC规范不建议携带请求体,Spring MVC默认对GET请求的JSON请求体解析存在限制,即使修正注解也可能出现参数绑定失败的问题。
你之前移除@Valid后接口能返回结果属于假象:此时Spring没有触发参数绑定+校验的完整流程,方法形参tpj实际为null,根本没有接收到你传入的JSON数据,没有实现预期的参数接收逻辑。
修复方案
按照以下步骤修改即可正常运行:
- 替换错误的
@RequestBody导包,删除Swagger的RequestBody导入语句,新增Spring Web的官方绑定注解导入:
import org.springframework.web.bind.annotation.RequestBody;
- 将接口的
@GetMapping注解替换为@PostMapping(JSON请求体应当用POST/PUT/PATCH这类支持请求体的请求方法),修正后的Controller代码如下:
import javax.validation.Valid; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestBody; import com.magicsoftware.restapi.exception.TestPOJO; @RestController @Validated @RequestMapping(path = "/Test") public class TestController { @PostMapping(value = "/test1") public String test1(@Valid @RequestBody TestPOJO tpj) { if (tpj instanceof TestPOJO) { System.out.println("Correct data format passed "); } return "working1"; } }
- Postman测试时将请求方法改为POST,请求头设置
Content-Type: application/json,传入你之前的请求体即可正常通过校验,返回200结果。
内容的提问来源于stack exchange,提问作者Dattatray Satpute
相关产品推荐
相关产品推荐

