【问题标题】:How to solve "p:message not working" in Primefaces?如何解决 Primefaces 中的“p:message not working”?
【发布时间】:2023-03-07 10:28:01
【问题描述】:

我正在构建一个让用户输入数据库连接参数的表单。输入参数后 用户可以测试(btnTester)是否可以使用其参数建立连接。

在所有情况下,都会为用户生成一条消息。这里是来自支持 bean 代码的连接尝试失败的示例:

(...)
addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Connection failed.", t.getLocalizedMessage()));
(...)

这是表单代码。我希望消息出现在 p:message 中。不幸的是,什么也没有发生。按钮后不显示信息(连接成功与否):\ 即使将全局属性设置为 false 或 true。

<h:form prependId="false">
(...)
  <h:panelGrid>                 
    <!-- Other form components here -->
    <f:facet name="footer">
      <p:commandButton
          id="btnTester"
          value="Tester"
          actionListener="#{assistantCreationSourcesBean.testerConnexionBase}"
          update="msgTester" />
          <p:message id="msgTester" for="btnTester" />
    </f:facet>
 </h:panelGrid>
</h:form>

我错过了什么?

【问题讨论】:

    标签: java jsf primefaces


    【解决方案1】:

    我认为你的问题在这里:

    addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Connection failed.", t.getLocalizedMessage()));
    

    我假设您拨打的是FacesContext.addMessage()。第一个参数是组件 ID 字符串。如果将其设置为 null,则强制消息为全局消息。您定义的&lt;p:message&gt; 组件设置为for="btnTester",因此它只会显示组件ID 与您的btnTester 组件ID 匹配的消息。

    addMessage() 的 Javadoc 除外:

    如果 clientId 不为 null,则将 FacesMessage 附加到与指定客户端标识符关联的消息集。如果 clientId 为 null,则假定此 FacesMessage 不与任何特定组件实例关联。

    Link to FacesMessage Javadoc for addMessage() method

    【讨论】:

      【解决方案2】:

      您的&lt;p:commandButton&gt; 上缺少一个update 属性,该属性指定要更新的&lt;p:message&gt; 组件的ID。

      你应该给出消息组件和ID,并在commandButton的update中指定它。

      【讨论】:

      • 我试过了,Primefaces 仍然不想给我任何消息。 WTF??
      • 您确定您在update 中的ID 正确吗?您的表单的 id 可能会预先添加到您的消息组件的 id 中。尝试将prependId="false" 添加到您的&lt;h:form&gt; 标签中。
      • 我已经编辑了我的初始帖子以反映我迄今为止测试的内容...... Primefaces 仍然没有显示任何内容。
      • 你打错了,你写的是preprendId="false"而不是prependId="false"
      【解决方案3】:

      我用咆哮代替消息来解决我的问题。

      【讨论】:

        【解决方案4】:

        找到了一个与 Prime face 中的消息完美配合的解决方案。

        与你分享想法,即使你用咆哮解决了它

        这里是解决方案

        add addMessage 有 2 个参数,一个 UIComponent Client Id 和 FacesMessage。 facesMessage 显示或定义消息,Component Child Id 显示组件的位置。 在这里,您错过了组件部分。 为了使其工作,您应该将 UIComponent 与 bean 类绑定。 这样它就可以找到 Component 。

        现在做如下,

        在 bean 类中定义一个 UIComponent

        与对应的命令按钮绑定

        并从 bean 类中的组件中获取 Id

        您的代码必须这样更改

        >  private UIComponent component;
        
        (...)
        addMessage(component.getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR,
        "Connection failed.", t.getLocalizedMessage()));
        (...)
        

        在 xhtml 文件中你必须绑定 UIComponent

        <h:form prependId="false">
        (...)
          <h:panelGrid>                 
            <!-- Other form components here -->
            <f:facet name="footer">
              <p:commandButton
                  id="btnTester"
                  value="Tester"
                  actionListener="#{assistantCreationSourcesBean.testerConnexionBase}"
                  update="msgTester" 
                  binding="#{assistantCreationSourcesBean.component}"/>
                  <p:message id="msgTester" for="btnTester" />
            </f:facet>
         </h:panelGrid>
        </h:form>
        

        现在消息将起作用..!!对我来说它工作得很好:)

        【讨论】:

          【解决方案5】:

          这里的“for”属性不适用于 p:message 使用 p:messages 代替。 <p:messages id="txtname" showIcon="false" showDetail="true" showSummary="false" redisplay="false" for="someKey" display="text"/>

          【讨论】:

            【解决方案6】:

            我的猜测是您尝试更新尚未渲染的组件。试试这个

            使用 Firefox Firebug 并检查 html 源代码以查看组件 ID msgTester 是否存在。如果不是,那么它解释了为什么您的更新不起作用。你不能更新它不存在的东西。如何解决这个问题,你可以为此创建一个包装器,并更新你的包装器。您的包装器应该始终存在,例如h:form。如果您不想更新整个表单,那么您可以尝试&lt;p:outputPanel id="wrapper"&gt;。所以你的代码看起来像这样

            <h:form>
                ...
                <p:outputPanel id="wrapper">
                    <p:commandButton ... update="wrapper"/>
                    <p:message />
                </p:outputPanel>
            </h:form>
            

            试试这个,让我知道它是否有效。

            【讨论】:

            • 我已经尝试了您的解决方案,但没有更多机会了。 PF 仍然没有显示消息 :(
            • 你有没有运行调试器,看看你是否到达了代码的那部分并抛出了一条消息?
            • 在所有情况下,我的代码都会向FacesContext 对象添加一条消息。我什至在内部检查了我添加的消息是否已存储。 FacesContext 确实将其存储在其内部列表中。由于我无法解释的原因,我无法收到我的消息(空的 xml 响应)。如果我使用咆哮组件,我可以在屏幕上看到消息(完整的 xml 响应)...
            【解决方案7】:

            我最近在使用 PrimeFaces 6.0.19 时遇到了这个问题。

            事实证明,我必须在调用 addMessage() 方法之前调用 FacesContext.getCurrentInstance().validationFailed() 才能正确显示消息。

            FacesContext.getCurrentInstance().validationFailed();
            //if you set the client ID to be null, you should add globalOnly=true in <p:messages>
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Connection failed.", t.getLocalizedMessage()));
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-02-12
              • 1970-01-01
              • 2015-09-04
              • 2015-07-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多