自定义注解实现参数校验

179 阅读2分钟

我正在参加「创意开发 投稿大赛」详情请看:掘金创意开发大赛来了!

1 前言

我们后端程序员撸代码的时候,需要校验各种各样的参数是否正确,一行行的if else令人眼花缭乱,最近发现了自定义注解来做这个事情真的是非常美妙。下边来记录一下,自定义注解实现参数校验的方法。

2 方法

下边先上代码

2.1 实体类

这是一个简单的demo类

@Data
public class UserVo {
    private Integer id;
    private String name;
    private Integer sex;
}

2.2 自定义的校验注解

这里的message就是当校验不通过的时候,显示的内容。

Constraint里是我们下边定义的校验器,就是在这里将校验注解和校验器绑定在一起的。

参数val是我们将限定的参数范围。

@Documented
@Constraint(validatedBy = ListValueConstraintValidator.class)
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ListValue {
    String message() default "提交的数据必须在数据列表中";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };

    int[] val() default {};
}

2.3 自定义的校验器

initialize方法是一个初始化方法,它会将我们拟定的参数范围放到set里边

isValid则是校验方法,校验传入的balue值是否在我们的要求范围内。

/**
 * 对应校验注解的校验器
 */
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
    private HashSet<Integer> set = new HashSet<>();
    /**
     * 初始化的方法
     * @param constraintAnnotation
     */
    @Override
    public void initialize(ListValue constraintAnnotation) {
        int[] val = constraintAnnotation.val();
        for (int i : val) {
            set.add(i);
        }
    }

    /**
     * 判断校验是否成功的方法
     * @param value 客户端传来的值
     * @param constraintValidatorContext
     * @return
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
        return set.contains(value);
    }

}

2.4 controller

这里需要注意的是需要在类上加@Validated注解才会起作用,@ListValue(val={0,1})注解会校验传入的参数sex是不是在0和1之内,若是不是则会抛出校验失败的错误。

@Validated
@Slf4j
@RestController
@RequestMapping("verify")
public class VerifyController {


    @GetMapping(value = "test/{sex}")
    //@WebLog(printResult = true)
    public String verifySex(@PathVariable @ListValue(val={0,1}) Integer sex) {
        UserVo userVo = new UserVo();
        userVo.setSex(sex);
        return userVo.toString();
    }
}

3 演示

我们直接访问这个接口,当传参为3的时候,校验失败,抛出如下错误。

http://localhost:8080/verify/test/3

image.png

当传参为1的时候,则校验通过。

http://localhost:8080/verify/test/1

image.png