如何解决Primefaces中的"p:message not working"?



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

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

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

这是表单代码。我希望消息显示在p:消息中。不幸的是,什么也没发生。按钮后没有显示任何消息(连接成功与否)即使将全局属性设置为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>

我错过了什么

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

您应该给出消息组件和ID,并在命令按钮的update中指定它。

我想你的问题在这里:

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

我假设你正在呼叫FacesContext.addMessage()。第一个参数是组件id字符串。如果将其设置为null,则强制该消息为全局消息。您已经定义的<p:message>组件被设置为for="btnTester",因此它将只显示具有与btnTester组件id匹配的组件id的消息。

除了来自Javadoc for addMessage():

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

链接到FacesMessage Javadoc的addMessage()方法

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

找到了一个解决方案,可以完美地处理Prime face中的消息。

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

解决方案

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

在bean类

中定义ui组件

与相应的命令按钮绑定

并从bean类

中的组件获取Id

你的代码必须像这样修改

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

必须在xhtml文件中绑定uiccomponent

<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>

现在消息将工作…!!对我来说,它工作得很好:)

这里的"for"属性对p:message不起作用,请使用p:messages。 <p:messages id="txtname" showIcon="false" showDetail="true" showSummary="false" redisplay="false" for="someKey" display="text"/>

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

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

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

我最近在使用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()));

相关内容

  • 没有找到相关文章

最新更新