我正在使用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"财产(前者对我来说似乎更合乎逻辑)。
答案 0 :(得分:0)
您可以根据需要在类或属性上定义约束。
通常,约束被放置在属性上,但是在你提到的情况下,由于多个属性是相关的并且是相互依赖的,你应该将约束置于类级别。