字段验证失败时添加全局消息

时间:2017-02-15 11:12:31

标签: validation jsf primefaces

通常,消息的PrimeFaces标记显示全局以及特定于字段的消息。我想要做的是只显示全局消息(globalOnly="true"),但如果任何字段的验证失败,也会显示一条公共消息。无论有多少字段失败,只需输入一条消息,例如“请更正您的数据”。字段特定错误已显示在输入字段旁边,因此无需显示两次。

我正在为每个输入使用复合组件(TextboxDropdownRadios,...)。每个字段的验证应在blur上使用文本框进行,并且可能在valuechanged上进行下拉和收音机。

现在我想要处理两种类型的验证。首先是JSF本身带来的标准验证器。例如required="true",还有validateRegexvalidateLength,...

然后有一些值我要检查另一个后端。对于那些我可能会在我的bean中创建方法并将它们称为我的

的监听器
<p:inputText id="#{cc.attrs.name}"
             value="#{cc.attrs.val}"
             styleClass="#{cc.attrs.iconClass}"
             required="#{cc.attrs.required}"
             requiredMessage="#{cc.attrs.requiredMessage}">
    <p:ajax event="blur" process="@form" update="outer-wrapper" 
            listener="#{cc.attrs.someValidationMethod}" />
</p:inputText>

所以基本上我想只有一个全局消息,如果任何字段验证失败。我知道可以用rendered="#{facesContext.validationFailed}"渲染一个额外的框,但我更喜欢有一个全局消息。是否有开箱即用的设置或是否必须实施?

1 个答案:

答案 0 :(得分:2)

我使用phase listener来执行此操作。这大致是我的实现(使用OmniFaces):

public class ValidationFailedListener implements PhaseListener
{

  @Override
  public void afterPhase(PhaseEvent event) { }

  @Override
  public void beforePhase(PhaseEvent event) {
    if (Faces.isValidationFailed()) {
      Messages.addGlobalError("Your validation failed message");
    }
  }

  @Override
  public PhaseId getPhaseId() {
    return PhaseId.RENDER_RESPONSE;
  }

}

您应该在faces-config.xml

中注册
<lifecycle>
  <phase-listener>your.ValidationFailedListener</phase-listener>
</lifecycle>

我的实际实现使用消息包来显示本地化消息。

如果你不能使用OmniFaces,这里是使用vanilla JSF的相关代码:

if (FacesContext.getCurrentInstance().isValidationFailed()) {
  FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                          "Your validation failed message",
                                          null);
  FacesContext.getCurrentInstance().addMessage(null, message);
}