JSF FacesContext#addMessage не отображается

В моем предыдущем вопросе у меня возникла проблема с отображением сообщений проверки из формы входа . Эта проблема теперь решена, но на этот раз я не могу отобразить собственное сообщение с FacesContex#addMessage.

Использование JSF + PrimeFaces.

<p:dialog header="Login" widgetVar="loginDlg">
    <h:form id="loginForm">
        <h:panelGrid columns="3" cellpadding="5">
            <h:outputLabel for="username" value="Username:" />
            <p:inputText value="#{loginBean.username}" id="username" required="true" label="username" />
            <p:message for="username" />
            <h:outputLabel for="password" value="Password:" />
            <h:inputSecret value="#{loginBean.password}" id="password" required="true" label="password" />
            <p:message for="password" />
            <f:facet name="footer">
                <p:commandButton value="Login" id="loginDlgButton" update=":loginForm,:welcomeMsg" actionListener="#{loginBean.login}"
                                    oncomplete="handleLoginRequest(xhr, status, args)"/>
                <p:message for="loginDlgButton" />
            </f:facet>
        </h:panelGrid>
    </h:form>
</p:dialog>

В LoginBean (a SessionScoped ManagedBean):

public void login() {
    FacesContext context = FacesContext.getCurrentInstance(); 
    RequestContext rContext = RequestContext.getCurrentInstance();
    HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest(); 
    try { 
        request.login(this.username, this.password); 
        rContext.addCallbackParam("loggedIn", true);
    } catch (ServletException e) { 
        rContext.addCallbackParam("loggedIn", false);
        context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Login Error", "Invalid credentials")); 
    } 
}

Этот код, когда проверка проходит успешно, а вход в систему завершается с ошибкой, должен отображать сообщение «Неверные учетные данные», но не отображает. Кроме того, где-то в теле моей веб-страницы я также добавил эту строку:

<p:messages autoUpdate="true" />

но мое сообщение не отображается даже там.

Javadocs говорят, что

Если clientId имеет значение null, предполагается, что этот FacesMessage не связан с каким-либо конкретным экземпляром компонента.

Но я не могу понять, что это значит.


person perissf    schedule 01.05.2012    source источник


Ответы (2)


поместите <p:messages autoUpdate="true" /> внутри вашего form или внутри некоторой оболочки, которая обновляется update вашего commandButton , или поместите loginDlgButton вместо null в context.addMessage(...

person Daniel    schedule 01.05.2012
comment
Спасибо Даниэль. Смотрите мой комментарий к другому ответу. - person perissf; 01.05.2012

Я не вижу тега p:messages в вашем коде. Это не то же самое, что тег p:message. p:message прикрепляется к другому компоненту и отображается как часть проверки. Компонент p:messages (или p:growl) — это то, что вы обновляете в своем bean-компоненте. Попробуйте добавить сообщения или компонент рычания следующим образом:

<h:form id="loginForm">
<p:growl id="messageGrowl" showDetail="true" sticky="false" />
<h:panelGrid columns="3" cellpadding="5">
person SteveS    schedule 01.05.2012
comment
Виноват. Это уже работало, но ответ немного запоздал и / или я его не видел! Итак, сообщение перехватывается тегом p:messages. Но как перехватить сообщение с неглобальным тегом p:message, не помещая компонентный идентификатор в bean-компонент? - person perissf; 01.05.2012
comment
Я думаю, вы спрашиваете, как поймать сообщение и отобразить в диалоге? Поместите p:messages в p:dialog. Затем вы можете добавить это в свой список обновлений с помощью командной кнопки. Если в контексте есть сообщение, отправленное обратно, оно будет обновлено. Вам, вероятно, потребуется отключить autoUpdate=true для другого компонента сообщений, иначе оба будут обновлены. - person SteveS; 01.05.2012