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

Validation 在验证错误期间添加faces消息时,JSF会跳过调用应用程序阶段吗?,validation,jsf,lifecycle,messages,Validation,Jsf,Lifecycle,Messages,我需要你的帮助来更好地理解这一点。这是我的情况。对于表单中的每个输入控件,我都有一个自定义验证器。因此,当出现任何验证错误时,我会在validate方法中添加相应的FacesMessage。我的理解是,当出现任何验证错误时,或者当自定义验证器的验证方法中添加了任何FacesMessage时,它将跳过调用应用程序阶段,并直接调用呈现响应阶段(显示在流程验证阶段添加的FacesMessage),这是否正确 我面临的问题是-由于验证错误,我在流程验证阶段添加了一条FacesMessage-并且我为用户

我需要你的帮助来更好地理解这一点。这是我的情况。对于表单中的每个输入控件,我都有一个自定义验证器。因此,当出现任何验证错误时,我会在validate方法中添加相应的FacesMessage。我的理解是,当出现任何验证错误时,或者当自定义验证器的验证方法中添加了任何FacesMessage时,它将跳过调用应用程序阶段,并直接调用呈现响应阶段(显示在流程验证阶段添加的FacesMessage),这是否正确

我面临的问题是-由于验证错误,我在流程验证阶段添加了一条FacesMessage-并且我为用户在调用应用程序阶段采取的操作添加了一条确认消息-现在这两条消息都显示在呈现响应阶段的页面中?-如果我对上述问题的理解是正确的,那么在确认当前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"  />

谢谢你的帮助

我的理解是,当出现任何验证错误时,或者当自定义验证器的验证方法中添加了任何FacesMessage时,它将跳过调用应用程序阶段,并直接调用呈现响应阶段(显示在流程验证阶段添加的FacesMessage),这是否正确

部分正确。只有当抛出
验证异常时,它才会跳过更新模型值并调用应用程序阶段,而不仅仅是在
面上下文中添加了
面消息时

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

您需要抛出
验证异常
,如下所示:

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消息添加到上下文中。当JSF捕获到一个
ValidatorException

时,它将自己完成这一切。这真的很有帮助。但是现在,这些消息在页面中显示了两次。我在validate方法中的sysout显示消息只添加了一次。知道可能是什么问题吗?可能是因为您指示视图端显示了两次?即,您有两个
h:messages
元素。根据给定的信息很难判断。我已经添加了如何添加和如何显示的代码。您可以检查一下吗?您自己确实在显式地向上下文添加两条消息。去掉
context.addMessage(null,facesMessage)
行,这不是在验证程序异常期间添加消息的方式。只要
抛出新的ValidatorException(facesMessage)
就足够了。你的权利。谢谢我想知道你是怎么知道的?!!!因为API没有说抛出ValidatorException会在FacesContext中添加相应的FacesMessage。