【发布时间】:2013-05-22 14:10:25
【问题描述】:
我有两个 PrimeFaces p:calendar 组件,一个代表开始,另一个代表结束日期。
我现在想在其中一个发生变化时运行一个验证器方法。
这是结束日期部分:
<p:calendar id="end-date"
widgetVar="testEndDate"
value="#{testManager.endDate}"
mindate="#{testManager.minEndDate}"
maxdate="#{testManager.maxEndDate}"
validator="#{testManager.validateEndDate}">
<p:ajax event="dateSelect" update="begin-date msgs" global="false" />
</p:calendar>
这是验证器方法代码:
@Override
public void validateEndDate(FacesContext context, UIComponent component, Object value)throws ValidatorException
{
System.out.println(this.getClass().getSimpleName() + ".validateEndDate()!");
Date beginDate = this.getBeginDate();
Date endDate = (Date)value;
if ( endDate != null && endDate.getTime() <= beginDate.getTime() )
{
System.out.println("End date less than or equal to begin date!");
// this.setValidated( false );
//
// throw new ValidatorException( JsfUtil.getValidationErrorFacesMessage( "common.validator.validTo.message" ) );
context.addMessage(null, JsfUtil.getValidationErrorFacesMessage("common.validator.validTo.message"));
}
List < FacesMessage > messages = context.getMessageList();
if ( !messages.isEmpty() )
{
System.out.println("Faces messages list not empty! Size = " + messages.size());
this.setValidated(false);
throw new ValidatorException(messages);
}
this.setValidated(true);
}
这是我的工作:
- 通过命令按钮显示对话框。
- 点击空白的结束日期日历输入,弹出日历。
- 点击 22(与开始日期相同的日期)。
代码基本上可以工作,至少根据控制台输出:
INFO: DefaultValidatingBeginEndDateChecker.validateEndDate()!
INFO: End date less than or equal to begin date!
INFO: Faces messages list not empty! Size = 1
但是,这会在 UI 上显示相同的 FacesMessage两次:
如您所见,输出与验证器方法所说的不匹配。
有谁知道发生了什么/出了什么问题以及如何解决这个问题? (还要注意显示工作解决方案的注释代码,但我需要知道为什么这不起作用,因为我有另一个更复杂的验证器,它有 1+ ifs 应该显示多个消息......)。
【问题讨论】:
-
可能是因为
msgs被调用了两次?当您在end-date上选择日期时,语句update="begin-date msgs"会刷新msgs和begin-date,这也会刷新msgs元素? -
msgs似乎没有更新两次。从显示对话框开始,发布的控制台输出已完成。开始日期默认为今天,因此开始日期不需要日历dateSelect。 -
哇,有人编辑了问题以更改 Java 代码的格式。已恢复。 :-)
标签: validation jsf jsf-2 primefaces