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

SpringBoot如何自定义Postman传入不完整对象时的500错误提示

解决SpringBoot接口参数缺失自定义业务错误的方案

步骤1:给实体类添加参数校验注解

给接收请求的实体类字段加校验规则,直接指定校验失败返回的业务提示:

import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;

// 外层请求DTO
@Data
public class StudentRequest {
    @Valid // 必须加,才能触发列表内部每个Student对象的字段校验
    private List<Student> student;
}

// 学生实体类
@Data
class Student {
    private String studentId;
    // 标注feesPayment字段不能为空,校验失败返回指定的业务提示
    @NotNull(message = "Fee Payment Details are missing")
    @Valid
    private FeesPayment feesPayment;

    @Data
    static class FeesPayment {
        private BigDecimal amount;
        private String code;
    }
}

注意:如果使用的是SpringBoot 2.x版本,校验注解的包路径为javax.validation而非jakarta.validation,替换对应import语句即可。

步骤2:Controller接口添加校验触发配置

在POST接口的请求参数前加@Valid注解,触发参数校验逻辑:

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import jakarta.validation.Valid;

@RestController
public class StudentController {
    @PostMapping("/你的POST接口路径")
    public Object submitFeeData(@RequestBody @Valid StudentRequest request) {
        // 原有业务逻辑
        return "操作成功";
    }
}

步骤3:添加全局异常处理器自定义返回格式

用全局异常捕获器拦截参数校验失败的异常,格式化返回和原有结构一致的错误响应:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;

@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, Object>> handleParamValidateError(MethodArgumentNotValidException ex) {
        Map<String, Object> errorResp = new HashMap<>();
        errorResp.put("timestamp", LocalDateTime.now());
        // 按HTTP规范参数错误推荐返回400,需要保留500的话替换为HttpStatus.INTERNAL_SERVER_ERROR即可
        errorResp.put("status", HttpStatus.BAD_REQUEST.value());
        errorResp.put("error", HttpStatus.BAD_REQUEST.getReasonPhrase());
        // 取校验注解中定义的业务错误信息返回
        FieldError firstError = ex.getBindingResult().getFieldError();
        String errorMsg = firstError != null ? firstError.getDefaultMessage() : "请求参数错误";
        errorResp.put("message", errorMsg);
        return new ResponseEntity<>(errorResp, HttpStatus.BAD_REQUEST);
    }
}

最终效果

此时发送缺少feesPayment字段的请求,会返回如下响应:

{
    "timestamp": "2024-xx-xxTxx:xx:xx",
    "status": 400,
    "error": "Bad Request",
    "message": "Fee Payment Details are missing"
}

内容的提问来源于stack exchange,提问作者Arindam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:36:02