【问题标题】:There are some unhandled FacesMessages, this means not every FacesMessage had a chance to be rendered有一些未处理的 FacesMessage,这意味着不是每个 FacesMessage 都有机会被渲染
【发布时间】:2012-12-27 14:32:35
【问题描述】:

我有一个 JSF 2.1 + PrimeFaces 3.3 页面:

<h:form id="particluar">
  <p:message id="msg" globalOnly="true" display="text"/>

  <h:panelGrid columns="2" id="test">
    <h:panelGrid id="panel2" columns="3">
      <p:inputText id="name1" value="Student.studentID" required="true"/>          
      <p:commandButton value="Check Name" actionListener="#{Student.abc}" process="name1" update="panel2" />
      <p:message id="msg1" for="name1" display="text"/>
    </h:panelGrid>

    <p:inputText id="name2" required="true"/>
    <p:message id="msg2" for="name2" display="text"/>

    <p:inputText id="name3" required="true"/>
    <p:message id="msg3" for="name3" display="text"/>

  </h:panelGrid>
  <p:commandButton value="submit" actionListener="#{Student.xyz}" update="particluar" />
</h:form>

我正在尝试在名称无效时手动添加面孔消息:

public void xyz() {
  if (name1.equals("primefaces")) {
    FacesContext.getCurrentInstance().addMessage("msg1", new FacesMessage(FacesMessage.SEVERITY_ERROR,"Invalid Name", "Invalid Name"));
  }
  if (name2.equals("primefaces")) {
    FacesContext.getCurrentInstance().addMessage("msg2", new FacesMessage(FacesMessage.SEVERITY_ERROR,"Invalid Name", "Invalid Name"));
  }
  if (name3.equals("primefaces")) {
    FacesContext.getCurrentInstance().addMessage("msg3", new FacesMessage(FacesMessage.SEVERITY_ERROR,"Invalid Name", "Invalid Name"));
  }
}

但它们没有出现,并且服务器日志不断打印以下警告:

有一些未处理的 FacesMessages,这意味着不是每个 FacesMessage 有机会被渲染

如何在页面中显示它们?

第二个问题,如果我提交带有三个空输入字段的表单,它会在与&lt;p:inputText&gt; 关联的每个&lt;p:message&gt; 中显示“必需的输入错误消息”。如何在&lt;p:message globalOnly="true"&gt; 中显示它们?

【问题讨论】:

    标签: jsf message


    【解决方案1】:

    如何在页面中显示它们?

    您需要指定一个有效的客户端 ID。客户端 ID 与组件 ID 不同。客户端 ID 就是您在 JSF 生成的 HTML 输出中看到的任何内容。此外,客户端 ID 应该是输入组件之一,而不是消息组件。

    所以,给定一个

    <h:form id="particular">
        <p:inputText id="name1" />
        <p:message id="msg1" for="name1" />
    </h:form>
    

    输入组件具有客户端 ID particular:name1(在浏览器中右键单击页面并执行查看源代码以自己查看)。因此,消息应该准确地附加在这个客户端 ID 上。

    context.addMessage("particular:name1", message);
    

    第二个问题,如果我提交带有三个空输入字段的表单,它会在与&lt;p:inputText&gt; 关联的每个&lt;p:message&gt; 中显示“必需的输入错误消息”。如何在&lt;p:message globalOnly="true"&gt; 中显示它们?

    &lt;p:message&gt; 不是有效的组件,您应该使用&lt;p:messages&gt;

    <p:messages id="msg" globalOnly="true" display="text"/>
    

    globalOnly="true" 属性意味着只会显示带有null 客户端 ID 的消息。因此,您应该只添加这样的消息。

    context.addMessage(null, message);
    

    另见:


    与具体问题无关,您尝试添加的非全局消息(“无效名称”)实际上应该由完全有价值的验证器完成。具体示例参见How to perform validation in JSF, how to create a custom validator in JSF

    【讨论】:

    • 谢谢,您的回答让我明白并解决了我的问题。但是我可以知道如何计算和显示错误总数吗?例如,如果这 3 个 inputText 带有 required="true",并且我清空了该字段,那么现在它会在它旁边的每条消息上显示错误消息,但是我如何计算并在全局中显示“total 3 error”信息?谢谢..
    • 您最好的选择是在beforePhaseRENDER_RESPONSE 上运行的PhaseListener。您可以通过FacesContext#getMessageXxx()方法获取消息并统计它们,然后添加新的全局消息。
    猜你喜欢
    • 2014-07-14
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多