2012-01-01 22 views
0

我從JSF 2.0的某個地方讀到,驗證器例程需要正確處理value參數爲null的情況。於是我就寫了這個validate方法,看起來像這樣:我真的需要在驗證器中檢查null嗎?

public void validateTandC(FacesContext context, UIComponent source, Object value) { 
    if (value == null || !(value instanceof Boolean)) { 
     FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, 
       "Terms and Conditions Not Accepted", "Value Not Present"); 
     throw new ValidatorException(fm); 
    } 
    if (((Boolean) value) != true) { 
     FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, 
       "Terms and Condistions Not Accepted", 
       "You must check the box that confirms you accept the Terms and Condtions "); 
     throw new ValidatorException(fm); 
    } 
} 

這是一個相當繁瑣建設,因爲在相關的頁面,僅從單個h該方法僅簡稱:selectBooleanCheckbox。如果是這樣的話,爲什麼第一個if聲明永遠解決爲真?如果我沒有,NPE會在現實生活中發生嗎?

+0

相關:[驗證必填複選框](http://balusc.blogspot.com/2008/09/validate-required-checkbox.html)。 – BalusC 2012-01-02 13:35:55

回答

2

由於事實上,一個綁定到<h:selectBooleanCheckbox>組件的屬性將永遠不會爲空。如果您沒有選中該框,則將是false,反之亦然。因此,您不需要檢查Validator中的null

此外,對於任何其他UIInput組件,我相信你可以簡單的required屬性設置爲truenull情況下將自動爲您處理。例如,

<h:inputText id="myInput" required="true" requiredMessage="Hey yo! Type something here." /> 
<h:message for="myInput" /> 

如果用戶錯過了上面的文本框,他會點擊提交按鈕後看到Hey yo! Type something here.消息。

+0

這是我正在尋找的「驗證」(無雙關語意圖)。我不確定所需的屬性。當我有required =「true」和一個驗證器=「#{bean.myValidator}」時,我結束了一些我無法理解的行爲。我沒有看太多,但我會再次回到土地的外觀。 – AlanObject 2012-01-01 16:36:35

+0

@AlanObject'required'&'validator'屬性不應該給對方帶來麻煩。無論如何,如果你有任何問題,你總是可以創建一個新的問題:)。 – 2012-01-01 16:39:58

1

如果valuenull,然後!(value instanceof Boolean)也將返回truenull不是Boolean的實例)。

所以,你可以簡化這個以消除你的支票的value == null部分不改變功能或不必擔心一個NPE - 消除你的「繁瑣的建設」:

if (!(value instanceof Boolean)) { 
+0

你說得對。最終,我在自己的陳述中輸入了很多因壞習慣而多餘的條款。 – AlanObject 2012-01-01 16:34:20