Springboot3.x RestfulAPI入参统一校验和异常处理

依赖引入

  <dependency>
  	<groupId>org.springframework.boot</groupId>
  	<artifactId>spring-boot-starter-validation</artifactId>
  	<version>3.x.x</version>   <-- 跟随spring boot版本-->
  </dependency>

1. request入参校验

在接口处增加注解@Validated

@RestController
public class ValidationTestController {


    @PostMapping("/user")
    public void addUser(@RequestBody @Validated UserDto userDto) {
        System.out.println(userDto);
    }

    @GetMapping("/user")
    public String getUser(@RequestParam("age") @Validated @Min(value = 16, message = "年龄最小为16") Integer age,
                          @RequestParam("nickname") @Validated @Size(min = 4, message = "搜索昵称长度最短为4") String nickname) {

        return "nickname: " + nickname + ", age: " + age;
    }

}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class UserDto {
    @NotBlank(message = "name is required")
    private String name;
    
    private String nickName;

    @Min(value = 1, message = "age is older than zero")
    @Max(value = 120, message = "age is letter than 120")
    private int age;
}

常用校验注解

常用注解作用
@NotEmpty字符串/集合非空
@NotNull值不能为null
@NotBlank字符串包含非空格字符
@Min数字最小值
@Max数字最大值
@Size集合/字符串长度范围
@Pattern正则表达式匹配
@Email邮箱格式校验
@Past值为已经过去的日期
@Future值为未来的日期

2. 全局异常处理

校验失败,通常会抛出异常MethodArgumentNotValidExceptionHandlerMethodValidationException,一般情况下会做统一处理

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Result<String>> handleValidationException(
            MethodArgumentNotValidException ex) {
        List<FieldError> errors = ex.getBindingResult().getFieldErrors();
        Map<String, String> errorMap = new LinkedHashMap<>();

        errors.forEach(error ->
                errorMap.put(error.getField(), error.getDefaultMessage()));

        return ResponseEntity.badRequest()
                .body(Result.error(ILLEGAL_ARGS.name(), errorMap.toString()));
    }

    @ExceptionHandler(HandlerMethodValidationException.class)
    public ResponseEntity<Result<String>> handlerMethodValidationException(
            HandlerMethodValidationException ex) {
        Map<String, String> errors = new LinkedHashMap<>();

        ex.getParameterValidationResults().forEach(result -> {
            MethodParameter param = result.getMethodParameter();

            // 生成参数标识(类型 + 位置)
            String paramKey = String.format("%s#%d",
                    param.getParameterName(),
                    param.getParameterIndex());

            result.getResolvableErrors().forEach(error ->
                    errors.put(paramKey, error.getDefaultMessage())
            );
        });

        return ResponseEntity.badRequest()
                .body(Result.error(ILLEGAL_ARGS.name(), errors.toString()));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值