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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:37:31