Spring Boot主类参数校验返回JSON遇Postman 400错误求助
解决Spring Boot参数校验返回自定义JSON(code=0)却收到400的问题
我来帮你搞定这个问题!出现400 Bad Request是因为Spring Boot默认会把参数校验失败的异常(比如MethodArgumentNotValidException)交给内置的异常处理器处理,返回400状态码和默认错误响应。你需要自定义全局异常处理逻辑,接管这类异常的处理,返回你想要的code=0的JSON结构,具体步骤如下:
1. 确保引入校验依赖
如果你用的是Spring Boot 2.3及以上版本,需要单独引入spring-boot-starter-validation依赖(之前的版本已经包含在web starter里):
<!-- Maven --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
2. 在Controller中启用参数校验
在需要校验的方法参数上添加@Valid(或者@Validated,支持分组校验)注解,比如处理POST请求的RequestBody:
@RestController @RequestMapping("/api") public class TestController { @PostMapping("/user") public ResponseEntity<CustomResponse> createUser(@Valid @RequestBody UserRequest request) { // 你的业务逻辑处理 return ResponseEntity.ok(new CustomResponse("0", "操作成功")); } // 如果是GET请求的@RequestParam参数,需要在Controller类上添加@Validated @Validated @GetMapping("/query") public ResponseEntity<CustomResponse> queryUser(@Min(1) @RequestParam("id") Integer id) { // 业务逻辑 return ResponseEntity.ok(new CustomResponse("0", "查询成功")); } }
3. 定义自定义响应实体
创建一个统一的响应类,包含你需要的code和其他字段:
public class CustomResponse { private String code; private String message; // 构造方法、getter和setter public CustomResponse(String code, String message) { this.code = code; this.message = message; } // 省略getter、setter方法 }
4. 自定义全局异常处理器
创建一个全局异常处理类,用@RestControllerAdvice标记,捕获参数校验相关的异常,返回自定义的响应:
@RestControllerAdvice public class GlobalValidationExceptionHandler { // 处理RequestBody参数校验失败的异常 @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<CustomResponse> handleRequestBodyValidation(MethodArgumentNotValidException ex) { // 如果你需要获取具体的校验错误信息,可以用ex.getBindingResult().getAllErrors() // 这里直接返回code=0的响应,你可以根据需求修改message内容 CustomResponse response = new CustomResponse("0", "参数校验不通过"); return ResponseEntity.ok(response); } // 处理@RequestParam等参数校验失败的异常 @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity<CustomResponse> handleRequestParamValidation(ConstraintViolationException ex) { CustomResponse response = new CustomResponse("0", "请求参数不合法"); return ResponseEntity.ok(response); } }
关键说明
- 全局异常处理器要确保被Spring Boot扫描到,建议放在主启动类所在的包或子包下。
- 如果需要返回更详细的错误信息,可以从异常对象中提取校验失败的字段和提示,比如:
List<String> errors = ex.getBindingResult() .getAllErrors() .stream() .map(DefaultMessageSourceResolvable::getDefaultMessage) .collect(Collectors.toList()); CustomResponse response = new CustomResponse("0", String.join(", ", errors));
这样配置后,当参数校验失败时,就会返回你想要的{"code":"0", "message":"xxx"}结构,并且HTTP状态码是200,不会再出现400 Bad Request了。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

