2012-05-10 40 views
1

這是場景。在我管理的bean,我創建了一個新的FacesMessage對象,並將其添加到FacesContext中,不與任何UI組件進行關聯,就像這樣:JSF:FacesMessage被顯示兩次

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> 

任何人都可以解釋這種現象?

+1

你確定你的代碼添加消息不是多次運行嗎?放置簡單的打印輸出..... – Daniel

+0

我已經按照您的建議在FacesMessage創建旁邊的託管bean中放置了一個打印輸出。打印輸出只出現一次。 – Jim

+0

只是好奇,如果你做context.addMessage(「測試」,消息);和globalOnly =「false」是否會刪除其他消息? –

回答

2

原來,這個問題是通過在應用程序中的階段監聽器的監督,這是不是在問題中提到所致。

此階段偵聽器旨在解決在應用程序的一個特定實例中持續跨兩個相鄰請求的FacesMessage問題。它將臨時將所有在請求作用域bean中創建的FacesMessage存儲到會話中。

但是,階段監聽器被錯誤地實現爲在每個請求期間執行。所以在會話範圍的bean中創建的FacesMessages(就像所討論的那樣)最終被複制了,這就解釋了爲什麼我看到了顯示兩次消息的摘要。

0

嘗試更改您的Web.xml。
變化PROJECT_STAGEDevelopmentProduction

<!-- 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> 
+0

只能隱藏未處理的消息。在OP的情況下,重複的消息不是未處理的消息。 – BalusC