@Target({ ElementType.TYPE, ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = RequiredValidator.class) public @interface Required { String message() default RequiredValidator.MESSAGE; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; public class RequiredValidator implements ConstraintValidator<Required, Object> { public static final String MESSAGE = "{error.validation.required}"; @Override public void initialize(Required constraintAnnotation) { } @Override public boolean isValid(Object object, ConstraintValidatorContext context) { if (object == null) { return false; } if (object instanceof String) { if (object.toString().trim().isEmpty()) { return false; } return true; } return true; } } }
其中下面的这部分是所有java自带的check注解里都有的。copy过来即可。
String message() default RequiredValidator.MESSAGE; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {};
validatedBy里指定的是实现类的类名,实现类里实现了ConstraintValidator接口,重载initialize和isValid方法,其中check的内容写在isValid方法里即可。
在controller里用@Validated即可使check生效。
@GetMapping("list") public ModelAndView list(@Validated ListFormEntity formEntity, BindingResult result) { if (result.hasErrors()) { return m; }
@Retention :用来说明该注解类的生命周期。它有以下三个参数:
RetentionPolicy.SOURCE : 注解只保留在源文件中
RetentionPolicy.CLASS : 注解保留在class文件中,在加载到JVM虚拟机时丢弃
RetentionPolicy.RUNTIME : 注解保留在程序运行期间,此时可以通过反射获得定义在某个类上的所有注解。
@Target : 用来说明该注解可以被声明在那些元素之前。
ElementType.TYPE:说明该注解只能被声明在一个类前。
ElementType.FIELD:说明该注解只能被声明在一个类的字段前。
ElementType.METHOD:说明该注解只能被声明在一个类的方法前。
ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前。
ElementType.CONSTRUCTOR:说明该注解只能声明在一个类的构造方法前。
ElementType.LOCAL_VARIABLE:说明该注解只能声明在一个局部变量前。
ElementType.ANNOTATION_TYPE:说明该注解只能声明在一个注解类型前。
ElementType.PACKAGE:说明该注解只能声明在一个包名前。
@Constraint来限定自定义注解的方法