1

これがシナリオです。管理対象Beanで、次のようにUIコンポーネントに関連付けずに、新しいFacesMessageオブジェクトを作成してFacesContextに追加します。

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には、次のようにメッセージの要約が2回表示されます。

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

誰かがこの行動を説明できますか?

4

2 に答える 2

2

この問題は、質問で言及されていない、アプリケーションのフェーズリスナーの見落としが原因であることが判明しました。

このフェーズリスナーは、アプリケーションの1つの特定のインスタンスで、2つの隣接するリクエスト間でFacesMessagesを永続化する問題を解決するために設計されました。リクエストスコープのBeanで作成されたすべてのFacesMessageをセッションに一時的に保存します。

ただし、フェーズリスナーは、すべての要求中に実行するように誤って実装されていました。そのため、セッションスコープのBean(問題のBeanなど)で作成されたFacesMessagesが複製されてしまいました。これが、メッセージの概要が2回表示された理由を説明しています。

于 2012-10-29T20:06:39.110 に答える
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>
于 2012-05-12T07:13:05.200 に答える