【问题标题】:JSF validator method results in duplicate FacesMessage shown in p:messagesJSF 验证器方法导致 p:messages 中显示重复的 FacesMessage
【发布时间】: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" 会刷新msgsbegin-date,这也会刷新msgs 元素?
  • msgs 似乎没有更新两次。从显示对话框开始,发布的控制台输出已完成。开始日期默认为今天,因此开始日期不需要日历 dateSelect
  • 哇,有人编辑了问题以更改 Java 代码的格式。已恢复。 :-)

标签: validation jsf jsf-2 primefaces


【解决方案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 );

哦。

【讨论】:

    【解决方案2】:

    我认为这是一种预期的行为。狐疑地看下面两行代码:

    1. context.addMessage(null, JsfUtil.getValidationErrorFacesMessage("common.validator.validTo.message"));
    2. throw new ValidatorException(messages);

    想想他们做了什么。第一行向当前上下文添加一条消息,第二行抛出一个异常,指示 JSF 验证失败,这反过来也将您的异常列表添加到当前上下文中。

    因此,解决方案很简单:删除多余的context.addMessage(null, JsfUtil.getValidationErrorFacesMessage("common.validator.validTo.message")); 行并将throws 子句替换为throw new ValidatorException(new FacesMessage(JsfUtil.getValidationErrorFacesMessage("common.validator.validTo.message")));

    【讨论】:

    • 问题是,我有另一个验证器,它应该显示 1 或 2 条消息,即每个日期可能与本地其他日期发生冲突,但也与外部约束日期发生冲突,所以有如果在代码中,将是另一个有效的。我先发布了简短的版本。正如您从评论的三行中看到的那样,您提出的解决方案是我所知道的,但问题是“为什么上面的变体显示的比列表中的变体更多,您如何解决这个问题?” (如果我无法使用简单的验证器完成它,则无需尝试更复杂的验证器,你知道...)。
    猜你喜欢
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2012-02-01
    • 2010-11-06
    • 2012-05-23
    相关资源
    最近更新 更多