2017-05-30 119 views
0

我采取一个内存API网关利用JAXB SOAP服务豆。其中一个模式元素是“选择”,并且在选择块中有几个元素。使用javax.validation验证与选择

我试图在客户端命名空间中镜像生成的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”中的一个设置为非空值(尽管我可以妥协于仅仅采用特定序列中的第一个非空值)。在每个“选择组”中,其他属性都是可选的,但如果选择了该特定选择组(可选属性非空,换句话说),则可能需要“需要”另一个属性。

我已经浏览了Hibernate Validator文档,但我不确定如何应用这种情况。

如果我定义了一个自定义注释和一个自定义ConstraintValidator,那么引用的注释在哪里?在类(如“SubscriberSelector”)或“subscriberSelector”属性(前者似乎更符合逻辑)。

+0

这真的取决于'ConstraintValidator'是如何定义的。你可以通过'@Target({ElementType.TYPE})'或者'Field Level''ConstraintValidator'来定义一个“Class Level”'ConstraintValidator'' @Target({ElementType.FIELD})' –

回答