我正在参加「创意开发 投稿大赛」详情请看:掘金创意开发大赛来了!
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
当传参为1的时候,则校验通过。
http://localhost:8080/verify/test/1