我有两个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);
}
这就是我的所作所为:
代码基本上可以工作,至少根据控制台输出:
INFO: DefaultValidatingBeginEndDateChecker.validateEndDate()!
INFO: End date less than or equal to begin date!
INFO: Faces messages list not empty! Size = 1
但是,这会在UI上显示相同的FacesMessage
两次:
如您所见,输出与验证方法所说的不匹配。
有谁知道发生了什么/错了什么以及如何解决这个问题? (另请注意显示工作解决方案的out -mented代码,但我需要知道为什么这不起作用,因为我有另一个更复杂的验证器,它有1+ ifs,它应该显示多条消息......)。 / p>
答案 0 :(得分:2)
在自己的列表中收集面部消息是有效的:
List<FacesMessage> messages = new ArrayList<FacesMessage>();
if ( endDate != null && endDate.getTime() <= beginDate.getTime() )
{
System.out.println( "End date less than or equal to begin date!" );
// context.addMessage( null, JsfUtil.getValidationErrorFacesMessage( "common.validator.validTo.message" ) );
messages.add( JsfUtil.getValidationErrorFacesMessage( "common.validator.validTo.message" ) );
}
// ... more ifs
if ( !messages.isEmpty() )
{
System.out.println( "Faces messages list not empty! Size = " + messages.size() );
this.setValidated( false );
throw new ValidatorException( messages );
}
this.setValidated( true );
卫生署。
答案 1 :(得分:1)
我认为这是一种预期的行为。怀疑地看下面两行代码:
context.addMessage(null, JsfUtil.getValidationErrorFacesMessage("common.validator.validTo.message"));
和throw new ValidatorException(messages);
。想想他们做了什么。第一行向当前上下文添加消息,第二行抛出异常,指示JSF验证失败,这反过来又将您的例外列表添加到当前上下文中。
因此,解决方案非常简单:删除多余的context.addMessage(null, JsfUtil.getValidationErrorFacesMessage("common.validator.validTo.message"));
行并替换throws
的{{1}}子句。