【问题标题】:How to validate a date from a Calendar如何验证日历中的日期
【发布时间】:2011-10-14 09:11:46
【问题描述】:

我已尝试使用以下代码(我遵循了一个示例)来测试从日历中选择的日期。如果我的数据库中不存在日期,则应向最终用户显示验证错误消息。但是,错误并没有出现在<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

【问题讨论】:

  • 您是否调试或使用了断点?您的 validateDate 函数是否曾经返回 true? ........你能发布你的代码吗?
  • @Saher,谢谢你的回复,我已经更新了我的帖子
  • 澄清一下,您想知道为什么没有消息返回给用户?与正确的异常似乎被捕获的事实相反?

标签: java validation jsf-2 primefaces


【解决方案1】:

再次查看您的代码,您自己在验证器中捕获并打印了ValidatorException!您不应该自己捕获并记录ValidatorException。你应该放过它,让 JSF 捕捉并处理它,以便它可以在消息组件中相应地显示它。

摆脱验证器中的try 块,并将throws 子句添加到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"));
    } 
}   

【讨论】:

  • 非常感谢,你的权利我听从了你的建议,除了味精之外它工作正常,它在提交后显示(我有一个按钮验证表单)但我希望显示味精在同一页面中选择日期之后!
【解决方案2】:

除了@Balusc 在his answer 中已经提到的验证器问题之外,您应该始终使用 PrimeFaces-components:

<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" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 2011-03-28
    • 1970-01-01
    相关资源
    最近更新 更多