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

时间:2011-07-13 15:25:40

标签: java jsf primefaces

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

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

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

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

我错过了什么?

7 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

以下是解决方案

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>

现在消息将有效.. !!对我而言,它非常有效:)

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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

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

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

答案 6 :(得分:0)

我最近在PrimeFaces 6.0.19中遇到了这个问题。

事实证明,在调用addMessage()方法之前,必须必须调用entity-b.module才能正确显示消息。

const routes: Routes = [
  { 
    path: 'b',
    component: EntityBComponent,
    children: [
      {
        path: 'detail',
        component: EntityBDetailComponent,
        outlet: 'details',
      },
    ]
  },

];

@NgModule({
  imports: [
    RouterModule.forChild(routes),
    CommonModule
  ],
  declarations: [
    EntityBComponent,
    EntityBDetailComponent
  ],
  exports: [
    EntityBComponent,
    EntityBDetailComponent
  ]
})
export class EntityBModule { }