java 校验api规范包含很多校验注解,hibernate实现了java校验api规范,在spring框架中集成进了hibernate校验实现,java api本身包含了很多常见的校验注解,直接拿来用即可,那么,如果我们想自定义校验注解该怎么做呢?
首先,定义一个注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Inherited
@Documented
@Constraint(validatedBy = PhoneValidator.class)
public @interface Phone {
String message() default "手机号码格式不正确";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
必须包含这三个属性,需要注意的是@Constraint(validatedBy = PhoneValidator.class),这个注解是指定校验器的,在这里,我们可以自定义校验规则
public class PhoneValidator implements ConstraintValidator<Phone, String> {
@Override
public void initialize(Phone constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (StringUtil.isEmpty(value)) {
return true;
}
//验证大陆,香港,澳门手机号
String regExp = "((13|18|17)\\d{9})|((145|147|150|151|152|153|155|156|157|158|159)\\d{8})|((1700|1705|1709)\\d{7})|(^([6|9])\\d{7}$)|(^[6]([8|6])\\d{5}$)";
Pattern p = Pattern.compile(regExp);
Matcher m = p.matcher(value);
return m.find();
}
}
接下来我们可以像正常的使用注解一样的用啦,
public class ValidateTest {
@NotBlank(message = "不能为空")
@Phone
String phone;
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
个人推荐,参数校验结合HandlerMethodArgumentResolver 组件来做更好,尤其针对前后端分离的项目