我採取一個內存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})' –