使用 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 级别。
我正在使用 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 级别。