JSF: FacesMessage отображается дважды

Вот сценарий. В моем управляемом bean-компоненте я создаю новый объект 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 дважды отображает сводку сообщения, например:

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

Кто-нибудь может объяснить такое поведение?


person Jim    schedule 10.05.2012    source источник
comment
вы уверены, что ваш код для добавления сообщений не работает несколько раз? разместить простые распечатки .....   -  person Daniel    schedule 10.05.2012
comment
Я поместил распечатку в свой управляемый компонент рядом с созданием FacesMessage, как вы предложили. Распечатка появляется только один раз.   -  person Jim    schedule 10.05.2012
comment
Просто любопытно, если вы сделаете context.addMessage(test, message); и globalOnly=false удаляет другое сообщение?   -  person Hitham S. AlQadheeb    schedule 10.05.2012
comment
Я только что попробовал ваше предложение с компонентом пользовательского интерфейса с id = test и без него. Сгенерированный html такой же, как и выше.   -  person Jim    schedule 11.05.2012
comment
Какая реализация/версия JSF? Какой сервлетконтейнер импл/версия? Это среда сервлета или портлета?   -  person BalusC    schedule 12.05.2012
comment
Это приложение было создано с помощью JSF 2.0 с контейнером сервлетов версии 2.5 в среде сервлетов.   -  person Jim    schedule 30.10.2012


Ответы (2)


Оказывается, эта проблема была вызвана недосмотром в прослушивателе фаз в приложении, который не был упомянут в вопросе.

Этот фазовый прослушиватель был разработан для решения проблемы с сохранением сообщений FacesMessages в двух смежных запросах в одном конкретном экземпляре приложения. Он будет временно хранить все FacesMessages, созданные в bean-компоненте с областью запроса, в сеансе.

Однако прослушиватель фазы был ошибочно реализован для выполнения во время каждого запроса. Таким образом, FacesMessages, которые были созданы в bean-компонентах с областью действия сеанса (например, рассматриваемый), в конечном итоге были дублированы, что объясняет, почему я видел сводку сообщения, отображаемую дважды.

person Jim    schedule 29.10.2012

Попробуйте изменить свой 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>
person choop    schedule 12.05.2012
comment
Это только скрывает необработанные сообщения. В случае OP повторяющееся сообщение не является необработанным сообщением. - person BalusC; 12.05.2012