2011-07-27 111 views
1

我已經嘗試了下面的代碼(我已經遵循一個示例)來測試日曆中選擇的日期。如果日期不存在於我的數據庫中,則應向最終用戶顯示驗證錯誤消息。但是,錯誤不會在<h:message>中結束,而是記錄到服務器日誌中。如何驗證日曆中的日期

查看:

<p:calendar id="date1" value="#{bean.date1}" showOn="button"> 
    <f:validator validatorId="calendarValidator" /> 
    <f:ajax execute="date1" render="calendarmessage" /> 
</p:calendar> 
<h:message id="calendarmessage" for="date1" /> 

驗證:

@FacesValidator("calendarValidator") 
public class CalendarValidator implements Validator{ 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) { 
     java.util.Date date2 = (java.util.Date) value; 

     try { 
      if (validateDate(date2)) { 
       throw new ValidatorException(new FacesMessage("A valid date")); 
      } else { 
       throw new ValidatorException(new FacesMessage("date dont figure in the database")); 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

服務器日誌:

INFO: date invalide 
GRAVE: javax.faces.validator.ValidatorException: date dont figure in the database 
at DAOKPI.CalendarValidator.validate(CalendarValidator.java:60) 
at javax.faces.component.UIInput.validateValue(UIInput.java:1149) 
at javax.faces.component.UIInput.validate(UIInput.java:967) 
at javax.faces.component.UIInput.executeValidate(UIInput.java:1233) 
at javax.faces.component.UIInput.processValidators(UIInput.java:698) 
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) 
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) 
at javax.faces.component.UIForm.processValidators(UIForm.java:253) 
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) 
at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214) 
at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1172) 
at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409) 
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1 
+0

做調試或使用斷點?您的validateDate函數是否會返回true? ........你可以發佈你的代碼嗎? –

+0

@Saher,謝謝你的回覆,我已更新我的帖子 – rym

+0

爲了澄清,你想知道爲什麼沒有消息返回給用戶?與正確的例外似乎被捕獲的事實相反? –

回答

3

看看你的代碼再次,你捕捉和打印ValidatorException驗證內部你自己!你不應該自己捕捉和記錄ValidatorException。您應該放手讓JSF捕獲並處理它,以便它可以相應地在消息組件中顯示它。

擺脫驗證程序trythrows條款添加到validate()方法。

@Override 
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
    java.util.Date date2 = (java.util.Date) value; 

    if (validateDate(date2)) { 
     throw new ValidatorException(new FacesMessage("A valid date")); // Btw: I wonder how that makes sense... That's actually not a validation error. 
    } else { 
     throw new ValidatorException(new FacesMessage("date dont figure in the database")); 
    } 
} 
+0

非常感謝你,你的權利我遵循你的建議,它的工作很好,除了味精,它提交後顯示(我有一個按鈕驗證表單),但我希望顯示味精後選擇日期同一頁! – rym

+0

也許你需要''。 – BalusC

0

除此之外@Balusc已經提到了his answer的驗證程序問題,您應該consitently使用PrimeFaces組件:

<p:calendar id="date1" value="#{bean.date1}" showOn="button"> 
    <f:validator validatorId="calendarValidator" /> 
    <p:ajax execute="date1" update="calendarmessage" /> 
</p:calendar> 
<p:message id="calendarmessage" for="date1" />