【问题标题】:When a faces message is added during validation error, will JSF skip the invoke application phase?在验证错误期间添加 faces 消息时,JSF 会跳过调用应用程序阶段吗?
【发布时间】:2010-06-01 10:56:59
【问题描述】:

我需要您的帮助才能更好地理解这一点。这是我的情况。我为表单中的每个输入控件都有一个自定义验证器。所以当有任何验证错误时,我会在 validate 方法中添加一个对应的 FacesMessage。我的理解是,当出现任何验证错误时 - 或者在自定义验证器的 validate 方法中添加了任何 FacesMessages 时,它将跳过 INVOKE APPLICATION 阶段并直接调用 RENDER RESPONSE PHASE - 显示添加的 FacesMessage过程验证阶段 - 这是正确的吗?

我面临的问题是 - 我在 PROCESS VALIDATION 阶段添加了一个 FacesMessage - 因为验证错误 - 我为用户在 INVOKE APPLICATION 阶段执行的操作添加了一条确认消息 - 现在两者显示在渲染响应阶段的页面中? - 如果我对上述问题的理解是正确的 - 在确认当前 FacesContext 中没有 FacesMessage 后有条件地添加确认 FacesMessage 是最佳做法吗?

这是添加消息的方式:

FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR,Constants.invalidMessageDetail,null);
         FacesContext.getCurrentInstance().addMessage(null, facesMessage);
throw new ValidatorException(facesMessage);

它是这样显示的:

<h:messages errorClass="ErrorMsg" warnClass="WarningMsg" infoClass="InfoMsg" layout="table"  />

感谢您的帮助。

【问题讨论】:

    标签: validation jsf lifecycle messages


    【解决方案1】:

    我的理解是,当有任何验证错误时——或者当自定义验证器的验证方法中添加任何 FacesMessages 时,它会跳过 INVOKE APPLICATION 阶段并直接调用 RENDER RESPONSE PHASE - 显示在过程验证阶段添加的 FacesMessage - 这是正确的吗?

    部分正确。它只会在ValidatorException抛出 时跳过更新模型值并调用应用程序阶段,而不是在简单地将FacesMessage 添加到FacesContext 时。

    如果我对上述问题的理解是正确的 - 在确认当前 FacesContext 中没有 FacesMessage 之后有条件地添加确认 FacesMessage 是最佳做法吗?

    您需要按如下方式抛出ValidatorException

    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        if (value does not meet conditions) {
            throw new ValidatorException(new FacesMessage("value does not meet conditions"));
        }
    }
    

    然后它将跳过更新模型值并根据需要调用应用程序阶段。请注意,您不需要手动将面孔消息添加到上下文中。当 JSF 捕获到 ValidatorException 时,它会自行完成所有操作。

    【讨论】:

    • 感谢 BalusC。那真的很有帮助。但是现在,消息在页面中显示了两次。我在验证方法中的系统输出显示该消息只添加了一次。知道可能是什么问题吗?
    • 可能是因为您两次指示视图侧显示它? IE。你有两个 h:messages 元素。根据目前提供的信息很难判断。
    • 我已经添加了如何添加和如何显示的代码。你能查一下吗?
    • 您确实在自己明确地将两条消息添加到上下文中。去掉context.addMessage(null, facesMessage) 行,这不是您想要在验证器异常期间添加消息的方式。只需throw new ValidatorException(facesMessage) 就足够了。
    • 你的权利。谢谢。我想知道你是怎么学的?!!!因为 API 没有说抛出 ValidatorException 会在 FacesContext 中添加相应的 FacesMessage。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    相关资源
    最近更新 更多