使用 javax.validation 来验证带有选择的 bean

using javax.validation to validate bean with choices

我正在使用 JAXB 实现到 SOAP 服务的内存中 API 网关。架构元素之一是 "choice",选择块中有多个元素。

我正在尝试在客户端名称空间中镜像生成的 JAXB classes,因此对于这个 "choice" 场景,我有一个具有多个属性的 bean class,只有一个这将是非空的。

我正在尝试使用来自 javax.validation 的 @NotNull 注释以及 ValidatorFactory 和 Validator。但是,"choice" 场景使这变得有点复杂。我猜这将需要自定义 ConstraintValidator,以及引用自定义 ConstraintValidator 的自定义注释。

例如,这里有一些类似于我的结构的一部分的假代码:

public class InquireRandomInformationRequest {
    @NotNull(message ="subscriberSelector cannot be null")
    @Valid
    private SubscriberSelector   subscriberSelector;  // required
    private SelectorMode         mode;                // optional
 ...
}

public class SubscriberSelector {
    // Choice 1
    private String                    billingAccountNumber;             // \d{8,9,12,13}; required
    private MarketInfo                billingMarket;                    // optional

    // Choice 2
    private String                    subscriberNumber;                 // \d{10}; required
    private ValidationCriteria        validationCriteria;               // optional
    private BillingAccountInformation billingAccountInformation;        // optional
    private MemoProductType           memoProductType;                  // optional

    // Choice 3
    private String                    unifiedBillingAccountNumber;      // [0-9A-Za-z]{13}; required
...
}

我知道我需要 "subscriberSelector" 属性 上的 @Valid 注释,以便验证器验证子对象。除此之外,我不太确定我需要做什么来处理选择问题。

为了适合我的示例,我将需要 "billingAccountNumber"、"subscriberNumber" 或 "unifiedBillingAccountNumber" 中的一个为非空(尽管我可以妥协简单地采用第一个非-null 一个特定序列中的一个)。在每个 "choice group" 中,其他属性是可选的,但如果选择了特定的选择组(选择器 属性 是非空的,则另一个 属性 可能是 "required" ,换句话说)。

我已经查看了 Hibernate Validator 文档,但我不确定如何在这种情况下应用它。

如果我定义了一个自定义注解和一个自定义ConstraintValidator,注解是在哪里被引用的?在 class 上(如 "SubscriberSelector")或在 "subscriberSelector" 属性 上(前者对我来说似乎更合乎逻辑)。

您可以根据需要在 class 或 属性 上定义约束。

通常,约束位于 属性,但在您提到的情况下,由于涉及多个属性且相互依赖,您应该将约束置于 class 级别。

请参阅我们的文档中的 https://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/#section-declaring-bean-constraints