超类的条件 Bean 验证

Conditional Bean Validation of Superclass

用例:当 adding/editing 地址或设置直接送货地址时,表单具有相同的字段。所以最好使用地址形式class作为投递形式的超级class:

public class AddressForm {
    @NotEmpty
    private String name;

    // ...
}

public class DeliveryForm extends AddressForm {
    public static enum ShippingType {
        DIRECT_SHIPPING,
        // ...
    }

    @NotNull
    private ShippingType shippingType;
    // ...
}

是否可以在 class 级别创建自定义约束(验证器)来设置是否验证超级 class 的条件?

如:

@ValidateSuperclassIf(field = "shippingType", value = "DIRECT_SHIPPING")
public class DeliveryForm extends AddressForm {
    // ...
}

那么javax.validation.ConstraintValidator<ValidateSuperclassIf, Object>.isValid(Object value, ConstraintValidatorContext context)方法如何实现呢?

Is it possible to create a custom constraint (validator) at class level to set the condition whether the super class should be validated or not?

不,你不能。 Bean Validation(规范)和参考实现 Hibernate Validator 都没有这样做的方法。

有一些讨论可以跳过超类型约束(HV-548 and BVAL-256),但这通常只会禁用它们,而不是添加条件(取消)激活。