java实现自定义注解校验

34 阅读1分钟

一、前言

在平时的业务开发中,我们常常需要校验前端传过来的参数是否正常、是否合理,那比如很多地方都需要去校验手机号位数是否为11位,如果不是11位那就抛异常提示,可能新手程序员会在每个方法中都写一个if判断语句,比如:

if(StringUtils.isNotBlank(param.getPhone)){
   int length = param.getPhone.length();
    if(length != 11){
     	throw new IllegalArgumentException("手机号码位数不正确");   
    }
}

如果每个方法中都写上这个判断语句,可能就会显得不是那么的优雅,那有没有其它好点的方法呢?有的,那就是今天要说的自定义注解实现参数校验了。

二、实现自定义注解校验的步骤

  1. 首先创建注解类,编写我们的校验注解
  2. 编写自定义校验的逻辑类,编写具体的校验逻辑。
  3. 开启使用自定义注解进行校验。
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = PhoneValidator.class)
@Documented
public @interface Phone {
    
    String message() default "手机号码位数不正确";

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

    Class<? extends Payload>[] payload() default {};
}
public class PhoneValidator implements ConstraintValidator<Phone, String>{

    @Override
    public void initialize(Phone constraintAnnotation) {
    }

    @Override
    public boolean isValid(String phone, ConstraintValidatorContext context) {
        //如果为空,则返回false
        if (StringUtils.isBlank(phone)) {
            return false;
        }
	   int length = phone.length();
        if (length==11) {
            return true;
        } else {
            return false;
        }
    }

}
public class User {
    private String name;

    @Phone
    private String phone;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}
@PostMapping("/addUser")
public void addUser(@RequestBody @Validated @Valid User user){
    System.out.println(user);
}

@Valid这个注解的作用就是使我们的@Phone注解起作用,在接口的入参实体类前添加@Valid注解,这时实体类会开启一个校验的功能。

通过自定义注解的方式,就可以少写一些重复性的校验代码了,看起来就比较优雅了。