4

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

我面临的问题是 - 我在过程验证阶段添加了一个 FacesMessage - 因为验证错误 - 我为用户在调用应用阶段所采取的操作添加了一条确认消息 - 现在两者都显示在渲染响应阶段的页面?- 如果我对上述问题的理解是正确的 - 在确认当前 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"  />

感谢你的帮助。

4

1 回答 1

7

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

部分正确。它只会ValidatorException抛出a 时跳过更新模型值并调用应用程序阶段,而不是在简单地将 aFacesMessage添加到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"));
    }
}

然后它将跳过更新模型值并根据需要调用应用程序阶段。请注意,您不需要手动将面孔消息添加到上下文中。当 JSF 捕获一个ValidatorException.

于 2010-06-01T11:16:55.533 回答