接口验参(优雅地写代码)

GET请求验参:

①在类上使用@Validated注解,标志该类使用参数验证

②在参数前面标志参数规范,如下图中GET请求规范手机号码不能为空,而且必须符合手机号码的正则表达式,否则返回设定好的message字段数据

@Validated
@RestController
@RequestMapping("/api")
public class DataController {

    @PostMapping("/insert")
    public String insert(@RequestBody @Validated User user){
        return "通过验证";
    }

    @GetMapping("/get")
    public String get(@NotBlank(message = "手机号码不能为空") @Pattern(regexp = "/^1[3456789]\\d{9}$/", message = "手机号码不正确") String mobile){
        return "通过验证";
    }
}

注意:请求参数不要用@RequestParam修饰,否则如果参数为空,系统将首先捕捉Spring参数不能为空的异常

 

POST请求验参:

①在请求对象前面使用@Validated注解,标志该请求对象使用参数验证(如上图POST请求)

②在入参对象的每个字段上面设置参数的规范:

@Data
public class User {

    @NotBlank(message = "名字不能为空")
    @Length(min = 3, max = 11, message = "名字长度必须大于3,小于11")
    private String name;

    @NotNull(message = "请输入年龄")
    @Min(value = 18, message = "不能低于18岁")
    @Max(value = 100, message = "大哥,你这么老吗?")
    private Integer age;

    @NotBlank(message = "手机号码不能为空")
    @Pattern(regexp = "^1[0-9]{10}$", message = "手机号码格式不正确")
    private String mobile;
}

参数不符合你设置的规范的时候,接口自动会返回 ConstrainViolationException 和 MethodArgumentNotValidException 两种异常,我们需要捕捉一下这两个异常,做统一的结果处理返回给前端

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    @ExceptionHandler(value = { ConstraintViolationException.class })
    public Result constraintViolationExceptionHandler(ConstraintViolationException e, HttpServletRequest request) {
        log.error("请求的路径:{},ConstraintViolationException", request.getRequestURI());
        Set> violations = e.getConstraintViolations();
        String error = null;
        for (ConstraintViolation violation : violations ) {
            error = violation.getMessage();
        }
        return ResultUtil.error(ResultEnum.VALIDE_ERROR.getCode(), error);
    }

    @ExceptionHandler(value = { MethodArgumentNotValidException.class })
    public Result methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e, HttpServletRequest request) {
        BindingResult result = e.getBindingResult();
        String error = result.getAllErrors().get(0).getDefaultMessage();
        log.error("请求的路径:{},MethodArgumentNotValidException", request.getRequestURI());
        return ResultUtil.error(ResultEnum.VALIDE_ERROR.getCode(), error);
    }
}

我们通过上图的全局异常处理,捕捉到参数验证的异常,解析出我们设定的message字段的数据,封装成我们返回给前端的固定形式。

 

PS:常见的验参注解:

@Null    限制只能为null
@NotNull    限制必须不为null
@AssertFalse    限制必须为false
@AssertTrue    限制必须为true
@DecimalMax(value)    限制必须为一个不大于指定值的数字
@DecimalMin(value)    限制必须为一个不小于指定值的数字
@Digits(integer,fraction)    限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future    限制必须是一个将来的日期
@Max(value)    限制必须为一个不大于指定值的数字
@Min(value)    限制必须为一个不小于指定值的数字
@Past    限制必须是一个过去的日期
@Pattern(value)    限制必须符合指定的正则表达式
@Size(max,min)    限制字符长度必须在min到max之间
@Past    验证注解的元素值(日期类型)比当前时间早
@NotEmpty    验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank    验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email    验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
 

你可能感兴趣的:(接口验参(优雅地写代码))