在验证错误期间添加faces消息时,JSF是否会跳过调用应用程序阶段?

时间:2010-06-01 10:57:00

标签: validation jsf lifecycle messages

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

我面临的问题是 - 我在PROCESS VALIDATION阶段添加了一个FacesMessage - 由于验证错误 - 我为INVOKE APPLICATION PHASE中的用户添加了一条确认消息 - 现在两者都是在RENDER RESPONSE阶段的页面中显示? - 如果我的理解在上述问题中是正确的 - 在确认当前FacesContext中没有FacesMessages之后,有条件地添加确认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"  />

感谢您的帮助。

1 个答案:

答案 0 :(得分:7)

  

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

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

  

如果我的理解在上述问题中是正确的 - 在确认当前FacesContext中没有FacesMessages后,有条件地添加确认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"));
    }
}

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