Validation JSF验证器方法会产生重复的FacesMessage,如p:messages所示
我有两个PrimeFacesValidation JSF验证器方法会产生重复的FacesMessage,如p:messages所示,validation,jsf,jsf-2,primefaces,Validation,Jsf,Jsf 2,Primefaces,我有两个PrimeFacesp:calendar组件,一个代表开始,另一个代表结束日期 我现在想在其中一个发生更改时运行一个验证器方法 以下是结束日期组件: <p:calendar id="end-date" widgetVar="testEndDate" value="#{testManager.endDate}"
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>
但是,这会在UI上两次显示相同的人脸消息:
正如您所看到的,输出与验证器方法所说的不匹配
有人知道发生了什么/出了什么问题以及如何解决吗?(还要注意显示有效解决方案的注释外的代码,但我需要知道为什么这不起作用,因为我有另一个更复杂的验证器,它有1+ifs,应该显示多条消息…。我认为这是一种预期行为。请可疑地查看以下两行代码:
context.addMessage(null,JsfUtil.getValidationErrorFacesMessage(“common.validator.validTo.message”)代码>和
抛出新的验证器异常(消息)代码>
想想他们在做什么。第一行向当前上下文添加一条消息,第二行抛出一个异常,指示JSF验证失败,这反过来又将异常列表添加到当前上下文中
因此,解决方案很简单:删除冗余的context.addMessage(null,JsfUtil.getValidationErrorFacesMessage(“common.validator.validTo.message”)代码>行并替换抛出新验证异常的抛出
子句(新FacesMessage(JsfUtil.getValidationErrorFacesMessage(“common.validator.validTo.message”))代码>有效的方法是在自己的列表中收集faces消息:
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 );
List messages=new ArrayList();
如果(endDate!=null&&endDate.getTime(),可能是因为调用了两次msgs
?当您在end date
上选择日期时,语句update=“begin date msgs”
刷新msgs
和begin date
,同时刷新msgs
元素?msgs
似乎不会更新两次。从显示对话框时开始,发布的控制台输出已完成。开始日期默认为今天,因此不需要日历dateSelect
begin date.Wow,有人编辑了这个问题以更改Java代码的格式。Restored:-)问题是,我有另一个验证器,它应该显示1或2条消息,即每个日期可能与本地其他日期冲突,但也与外部约束日期冲突,因此代码中实际上会有另一个if。我先发布了简短的版本。正如你可以从评论的三行中看到的,我知道你提出的解决方案,但问题是“为什么上面的变量比列表中的变量显示得更多,你如何解决这个问题?”(如果我不能用easy validator完成,就没有必要尝试更复杂的一个,你知道……)。
INFO: DefaultValidatingBeginEndDateChecker.validateEndDate()!
INFO: End date less than or equal to begin date!
INFO: Faces messages list not empty! Size = 1
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 );