2017-05-30 44 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})' –

回答