Jsf 2 JSF:FacesMessage显示两次

Jsf 2 JSF:FacesMessage显示两次,jsf-2,facescontext,Jsf 2,Facescontext,下面是一个场景。在我的托管bean中,我创建了一个新的FacesMessage对象,并将其添加到FacesContext中,而不将其与任何UI组件关联,如下所示: FacesContext context = FacesContext.getCurrentInstance(); FacesMessage message = new FacesMessage(); message.setSummary("Hi there!"); context.addMessage(null, message);

下面是一个场景。在我的托管bean中,我创建了一个新的FacesMessage对象,并将其添加到FacesContext中,而不将其与任何UI组件关联,如下所示:

FacesContext context = FacesContext.getCurrentInstance();
FacesMessage message = new FacesMessage();
message.setSummary("Hi there!");
context.addMessage(null, message);
<h:messages id="someId" globalOnly="true" showSummary="true" showDetail="false" styleClass="startUpMessages"/>
<ul id="mainForm:someId" class="startUpMessages"><li>   Hi there! </li><li> Hi there! </li></ul>
<ul id="javax_faces_developmentstage_messages" title="Project Stage[Development]: Unhandled Messages"></ul>
在我的xhtml页面中,我输出的消息如下:

FacesContext context = FacesContext.getCurrentInstance();
FacesMessage message = new FacesMessage();
message.setSummary("Hi there!");
context.addMessage(null, message);
<h:messages id="someId" globalOnly="true" showSummary="true" showDetail="false" styleClass="startUpMessages"/>
<ul id="mainForm:someId" class="startUpMessages"><li>   Hi there! </li><li> Hi there! </li></ul>
<ul id="javax_faces_developmentstage_messages" title="Project Stage[Development]: Unhandled Messages"></ul>

但是,生成的html会显示两次消息摘要,如下所示:

FacesContext context = FacesContext.getCurrentInstance();
FacesMessage message = new FacesMessage();
message.setSummary("Hi there!");
context.addMessage(null, message);
<h:messages id="someId" globalOnly="true" showSummary="true" showDetail="false" styleClass="startUpMessages"/>
<ul id="mainForm:someId" class="startUpMessages"><li>   Hi there! </li><li> Hi there! </li></ul>
<ul id="javax_faces_developmentstage_messages" title="Project Stage[Development]: Unhandled Messages"></ul>
  • 你好

    有人能解释这种行为吗?

    尝试更改您的Web.xml
    项目阶段
    开发
    更改为
    生产

    <!-- Web application context parameters -->
    <context-param>
        <description>One of Production, Development, UnitTest, SystemTest, Extension
            Default is Production.
        </description>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Production</param-value>
    </context-param>
    
    
    生产、开发、单元测试、系统测试、扩展之一
    默认值是生产。
    javax.faces.PROJECT_阶段
    生产
    
    事实证明,这个问题是由应用程序中的阶段侦听器中的疏忽引起的,而问题中没有提到这一点

    此阶段侦听器旨在解决在应用程序的一个特定实例中跨两个相邻请求持久化FacesMessage的问题。它会将在请求范围bean中创建的所有FacesMessage临时存储到会话中


    但是,阶段侦听器被错误地实现为在每个请求期间执行。因此,在会话范围的bean中创建的FacesMessages(如有问题的bean)最终被复制,这解释了为什么我看到消息摘要显示了两次。

    您确定添加消息的代码没有运行几次吗?放置简单的打印输出…..我已经按照您的建议在我的托管bean中的FacesMessage创建旁边放置了一个打印输出。打印输出只出现一次。如果您使用context.addMessage(“test”,message),那么只是好奇而已;globalOnly=“false”是否删除了另一条消息?我刚刚尝试了您的建议,有没有id为=“test”的UI组件。生成的html与上面相同。JSF impl/version是什么?什么servletcontainer impl/version?是servlet还是portlet环境?它只隐藏未处理的消息。在OP的情况下,重复消息不是未处理的消息。