Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation JSF验证器方法会产生重复的FacesMessage,如p:messages所示_Validation_Jsf_Jsf 2_Primefaces - Fatal编程技术网

Validation JSF验证器方法会产生重复的FacesMessage,如p:messages所示

Validation 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}"

我有两个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>
但是,这会在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 );