h:具有for属性的消息元素不在JSF 2中显示消息

bra*_*zzi 2 java glassfish facelets jsf-2

我在Glassfish 3上运行的JSF中有以下身份验证表单:

<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>
Run Code Online (Sandbox Code Playgroud)

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

如果没有给出用户登录,我会尝试显示一条特定的消息<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)]
Run Code Online (Sandbox Code Playgroud)

(实际上,我在谷歌寻找一些翻译,因为我得到的真实信息是葡萄牙语:

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)]
Run Code Online (Sandbox Code Playgroud)

)

我究竟做错了什么?

提前致谢!

Bal*_*usC 8

您需要指定客户端ID,而不是组件ID.根据给定的视图代码,这将是:

FacesContext.getCurrentInstance().addMessage(
    "form-login:login-user", message);
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,则需要在浏览器中打开页面并查看其生成的HTML源代码.它应该id与生成的HTML <input>元素的属性相同.


与此问题无关,我通常使用null客户端ID <h:messages globalOnly="true">作为一般验证错误.您可能希望采用相同的方法.对于"你需要给用户"的部分,我只是使用required="true".