使用javax.validation验证bean的选择

时间:2017-05-30 21:12:13

标签: java hibernate-validator

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

我试图在客户端命名空间中镜像生成的JAXB类,因此对于这个"选择"我有一个带有几个属性的bean类,其中只有一个属性为非null。

我尝试使用javax.validation中的@NotNull注释,以及ValidatorFactory和Validator。但是,选择"场景使这有点复杂。我猜测这会调用自定义的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)。

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

如果我定义自定义注释和自定义ConstraintValidator,引用的注释在哪里?在类(如" SubscriberSelector")或" subscriberSelector"财产(前者对我来说似乎更合乎逻辑)。

1 个答案:

答案 0 :(得分:0)

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

通常,约束被放置在属性上,但是在你提到的情况下,由于多个属性是相关的并且是相互依赖的,你应该将约束置于类级别。

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