java自定义注解用作验证
自定义注解之@Constraint
在注解的上面指定验证类,可以自定义验证注解
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RetentionPolicy.RUNTIME)
/** jdk8新增的注解,用于可以在注解上添加注解,就可以使用重复多个注解了*/
@Repeatable(CheckTenantId.List.class)
@Documented
@Constraint(validatedBy = CheckTenantIdValidate.class)
public @interface CheckTenantId {
String message() default "";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@interface List {
CheckTenantId[] value();
}
}
此为验证类:
public class CheckTenantIdValidate implements ConstraintValidator {
@Override
public void initialize(CheckTenantId constraintAnnotation) {
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
if (context == null) {
return true;
}
BeanWrapper beanWrapper = new BeanWrapperImpl(value);
Object tenantId = String.valueOf(beanWrapper.getPropertyValue("singleTenantId"));
TenantType tenantType = (TenantType) beanWrapper.getPropertyValue("tenantType");
if (tenantType == TenantType.SINGLE && tenantId == null) {
return false;
}
return true;
}
}
注解里面@Groups的用法
@Validated({Insert.class}) @RequestBody ServerInfoDto serverInfoDto
此时验证的时候,传递了一个Insert.class,于是在ServerInfoDto类中只有@NotNull(groups={Insert.class},message = "协议名称不能为空")中
groups中带有insert.class才会生效。