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

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

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

我究竟做错了什么?

提前致谢!

参考方案

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

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

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

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

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

Java RegEx中的单词边界\ b - java

我在使用\b作为Java Regex中的单词定界符时遇到困难。对于text = "/* sql statement */ INSERT INTO someTable"; Pattern.compile("(?i)\binsert\b");找不到匹配项Pattern insPtrn = Pattern.compile(&…

Java Double与BigDecimal - java

我正在查看一些使用双精度变量来存储(360-359.9998779296875)结果为0.0001220703125的代码。 double变量将其存储为-1.220703125E-4。当我使用BigDecimal时,其存储为0.0001220703125。为什么将它双重存储为-1.220703125E-4? 参考方案 我不会在这里提及精度问题,而只会提及数字…

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

字符串内存分配 - java

哪一个更好System.out.println("hello world"); 要么String s="hello world"; System.out.println(s); 参考方案 对于此简单示例,在内存分配方面没有区别。