有時候現有的驗證註解知足不了部分業務需求,因此就有了擴展自定義註解。java
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.ElementType.PARAMETER; import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * User: zhoujingjie * Date: 14-10-31 * Time: 下午6:00 */ @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) @Retention(RUNTIME) @Documented @Constraint(validatedBy = { PhoneNoValidator.class}) public @interface PhoneNo { //默認錯誤消息 String message() default "手機號碼錯誤"; //分組 Class<?>[] groups() default { }; //負載 Class<? extends Payload>[] payload() default { }; //指定多個時使用 @Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE }) @Retention(RUNTIME) @Documented @interface List { PhoneNo[] value(); } }
自定義註解須要自定義validator,因此註解裏變量也不是強制須要,能夠就一個message也能夠apache
import org.apache.commons.lang.StringUtils; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; /** * 手機號碼驗證 * User: zhoujingjie * Date: 14-11-1 * Time: 上午10:45 */ public class PhoneNoValidator implements ConstraintValidator<PhoneNo,String> { @Override public void initialize(PhoneNo constraintAnnotation) { } @Override public boolean isValid(String value, ConstraintValidatorContext context) { if(StringUtils.isEmpty(value)) return true; if(value.matches("((\\+86)|(86))?1[3|4|5|8]\\d{9}")){ return true; } return false; } }
完成,一個簡單的自定義註解就完工了。使用方式與其餘註解如出一轍ide