这是场景。在我的托管bean中,我创建了一个新的FacesMessage对象并将其添加到FacesContext,而不将其与任何UI组件相关联,如下所示:
FacesContext context = FacesContext.getCurrentInstance();
FacesMessage message = new FacesMessage();
message.setSummary("Hi there!");
context.addMessage(null, message);
在我的xhtml页面中,我输出的信息如下:
<h:messages id="someId" globalOnly="true" showSummary="true" showDetail="false" styleClass="startUpMessages"/>
但是,生成的html会显示消息摘要两次,如下所示:
<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>
任何人都可以解释这种行为吗?
答案 0 :(得分:2)
原来这个问题是由应用程序中的阶段监听器监督造成的,问题中没有提到。
此阶段侦听器旨在解决在应用程序的一个特定实例中跨两个相邻请求持久保存FacesMessages的问题。它会将请求范围内的bean中创建的所有FacesMessages临时存储到会话中。
然而,错误地实现了阶段监听器以在每个请求期间执行。因此,在会话作用域bean(如有问题的bean)中创建的FacesMessages最终被复制,这解释了为什么我看到消息摘要显示两次。
答案 1 :(得分:0)
尝试更改Web.xml。
将PROJECT_STAGE
从Development
更改为Production
<!-- 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>