如何在Primefaces中解决“p:message not working”?

问题描述 投票:7回答:7

我正在构建一个允许用户输入数据库连接参数的表单。一旦输入参数,用户就可以测试(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>

我错过了什么?

java jsf primefaces
7个回答
4
投票

我认为你的问题在这里:

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

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

除了addMessage()的Javadoc:

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

Link to FacesMessage Javadoc for addMessage() method


3
投票

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

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


2
投票

我使用咆哮而不是消息来解决我的问题。


1
投票

找到一个完美的解决方案,与Prime脸上的消息完美配合。

想与你分享,即使你用咆哮来解决问题

这是解决方案

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

现在做如下,

在bean类中定义UIComponent

使用相应的命令Button绑定它

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

现在消息将起作用.. !!对我来说它完美地工作:)


1
投票

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


0
投票

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

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

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


0
投票

我最近使用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()));
© www.soinside.com 2019 - 2024. All rights reserved.