我采取一个内存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”属性(前者似乎更符合逻辑)。
这真的取决于'ConstraintValidator'是如何定义的。你可以通过'@Target({ElementType.TYPE})'或者'Field Level''ConstraintValidator'来定义一个“Class Level”'ConstraintValidator'' @Target({ElementType.FIELD})' –