h: элементы сообщения с атрибутом for не представляют сообщения в JSF 2 - PullRequest
2 голосов
/ 18 февраля 2011

У меня есть следующая форма аутентификации в JSF, работающая на Glassfish 3:

<h:messages globalOnly="true" errorClass="erro" />
<h:form id="form-login">
    <h:outputText value="User" />
    <h:message for="login-user" />
    <h:inputText id="login-user" 
        value="#{authenticationBean.user}" showMessages="true" />

    <h:outputText value="Password" />
    <h:inputSecret id="login-password" 
        value="#{authenticationBean.password}" />

    <h:commandButton id="Log in" 
        action="#{authenticationBean.logIn}" value="Autenticar-se" />
</h:form>

Ниже приведен метод authentication.logIn:

public String logIn() {
    user = userDAO.authenticate(user, password);
    if (user != null) {
        FacesMessage message = new FacesMessage("Welcome!");
        message.setSeverity(FacesMessage.SEVERITY_INFO);
        FacesContext.getCurrentInstance().addMessage(null, message);
        return "ok";
    } else {
        FacesMessage message = new FacesMessage("Authentication failed");
        message.setSeverity(FacesMessage.SEVERITY_ERROR);
        FacesContext.getCurrentInstance().addMessage(null, message);
        if ("".equals(user)) {
            message = new FacesMessage("You need to give a user");
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            FacesContext.getCurrentInstance().addMessage(
                "login-user", message);
        }
        return "fail";
    }
}

Я пытаюсь показать конкретное сообщение, если имя пользователя не указано, со строкой <h:message for="login-user" />. Однако это не работает: если я нажимаю кнопку отправки с пустым пользовательским полем, элемент <h:messages globalOnly="true" errorClass="erro" /> представляет "Authentication failed", а компонент <h:message for="login-user" /> просто не отображает текст "You need to give a user", как я ожидал. Вместо этого это не представляет никакого сообщения вообще. Также в журнале появляется следующее предупреждение:

[lifecycle] WARNING: FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=login-user[severity=(ERROR 2), summary=(You need to give a user), detail=(You need to give a user)]

(На самом деле я искал перевод в Google, поскольку реальное сообщение, которое я получил, было на португальском:

INFO: WARN: FacesMessage(s) foram enfileirados, mas podem não ter sido exibidos.
sourceId=login-usuario[severity=(ERROR 2), summary=(You need to give a user), detail=(You need to give a user)]

)

Что я делаю не так?

Заранее спасибо!

1 Ответ

8 голосов
/ 18 февраля 2011

Вам необходимо указать идентификатор клиента, а не идентификатор компонента.На основании данного кода представления это будет:

FacesContext.getCurrentInstance().addMessage(
    "form-login:login-user", message);

Если это не сработает, вам нужно открыть страницу в браузере и просмотреть сгенерированный исходный код HTML.Он должен совпадать с атрибутом id сгенерированного элемента HTML <input>.


Вне зависимости от проблемы, я обычно использую null в качестве идентификатора клиента и <h:messages globalOnly="true"> для общей проверкиошибки.Вы можете принять тот же подход.Для части «Вам нужно дать пользователя» я бы просто использовал required="true".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...