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
相关产品推荐
相关产品推荐

