一、前言
在平时的业务开发中,我们常常需要校验前端传过来的参数是否正常、是否合理,那比如很多地方都需要去校验手机号位数是否为11位,如果不是11位那就抛异常提示,可能新手程序员会在每个方法中都写一个if判断语句,比如:
if(StringUtils.isNotBlank(param.getPhone)){
int length = param.getPhone.length();
if(length != 11){
throw new IllegalArgumentException("手机号码位数不正确");
}
}
如果每个方法中都写上这个判断语句,可能就会显得不是那么的优雅,那有没有其它好点的方法呢?有的,那就是今天要说的自定义注解实现参数校验了。
二、实现自定义注解校验的步骤
- 首先创建注解类,编写我们的校验注解
- 编写自定义校验的逻辑类,编写具体的校验逻辑。
- 开启使用自定义注解进行校验。
@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注解,这时实体类会开启一个校验的功能。
通过自定义注解的方式,就可以少写一些重复性的校验代码了,看起来就比较优雅了。