java - 如何验证日历中的日期

标签 java validation jsf-2 primefaces

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

validator :

@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

最佳答案

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

去掉 validator 中的try block 并将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"));
    } 
}   

关于java - 如何验证日历中的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6846882/

相关文章:

c# - ASP.NET 4.5 TryUpdateModel 不使用母版页在 WebForm 中选择表单值

jakarta-ee - 如何访问支持 UIComponent 中的复合组件属性值?

java - JSF持久性文件问题

java - 安卓语音识别: startActivityForResult() does not work

Java - 如何让 jframe 调整到小于设置大小的大小

java - 如何最好地清理 Java webapp 中的输入

html - Primefaces CSS header 太大

java - 当应该使用带有自动注入(inject)字段的方法时,突变没有被终止

java - 防火墙后的 JMS 客户端

java - 是否有用于值相等的 Java Validation 注释