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才会生效。