如何显示我的应用程序';JSF中的错误?

如何显示我的应用程序';JSF中的错误?,jsf,error-handling,facelets,Jsf,Error Handling,Facelets,在我的JSF/Facelets应用程序中,以下是我的部分表单的简化版本: <h:form id="myform"> <h:inputSecret value="#{createNewPassword.newPassword1}" id="newPassword1" /> <h:message class="error" for="newPassword1" /> <h:inputSecret value="#{createNewPasswor

在我的JSF/Facelets应用程序中,以下是我的部分表单的简化版本:

<h:form id="myform">
  <h:inputSecret value="#{createNewPassword.newPassword1}" id="newPassword1" />
  <h:message class="error" for="newPassword1" />
  <h:inputSecret value="#{createNewPassword.newPassword2}" id="newPassword2" />
  <h:message class="error" for="newPassword2" />
  <h:commandButton value="Continue" action="#{createNewPassword.continueButton}" />
</h:form>

我错过了什么?任何帮助都将不胜感激

在谷歌搜索时发现。第二篇文章指出了JSF的不同阶段,这可能会导致错误消息丢失。另外,请尝试使用null代替“newPassword”,因为您没有任何id为newPassword的对象。

JSF是一个野兽。我可能遗漏了一些东西,但我曾经通过将所需消息保存到bean的属性,然后通过outputText显示该属性来解决类似的问题:

<h:outputText
    value="#{CreateNewPasswordBean.errorMessage}"
    render="#{CreateNewPasswordBean.errorMessage != null}" />

我试着这样做是最好的猜测,但没有成功:

public Navigation continueButton() {
  ...
  expensiveMethod();
  if(...) {
    FacesContext.getCurrentInstance().addMessage("newPassword", new FacesMessage("Error: Your password is NOT strong enough."));
  }
}
在我看来这是对的。您是否尝试过显式设置消息严重性?此外,我认为ID需要与组件的ID相同(即,如果这些是您的ID,则需要使用newPassword1或newPassword2,而不是示例中的newPassword)


然后使用
在JSF页面上显示错误消息。

您还必须在对addMessage()的调用中包含FormID

这应该能奏效


问候。

如果有人好奇,我可以根据你所有的回答加起来找出答案

这在Facelet中:

<h:form id="myform">
  <h:inputSecret value="#{createNewPassword.newPassword1}" id="newPassword1" />
  <h:message class="error" for="newPassword1" id="newPassword1Error" />
  <h:inputSecret value="#{createNewPassword.newPassword2}" id="newPassword2" />
  <h:message class="error" for="newPassword2" id="newPassword2Error" />
  <h:commandButton value="Continue" action="#{createNewPassword.continueButton}" />
</h:form>
而且它有效!谢谢你的帮助

需要组件的客户端id,而不是id。如果您想知道为什么,可以考虑将一个控件作为dataTable的子控件,用同一个控件为每一行打印出不同的值—这可能会为每一行打印不同的消息。id总是相同的;clientId每行都是唯一的

所以“myform:mybutton”是正确的值,但硬编码是不明智的。查找将减少视图和业务逻辑之间的耦合,并且是一种适用于更严格的环境(如Portlet)的方法

<f:view>
  <h:form>
    <h:commandButton id="mybutton" value="click"
      binding="#{showMessageAction.mybutton}"
      action="#{showMessageAction.validatePassword}" />
    <h:message for="mybutton" />
  </h:form>
</f:view>
记住:

FacesContext context = FacesContext.getCurrentInstance();
context.addMessage( null, new FacesMessage( "The message to display in client" ));            
也是有效的,因为当将null指定为第一个参数时,它将应用于整个表单


更多信息://过时的

简单回答,如果您不需要将其绑定到特定组件

爪哇:

XHTML:

            <h:messages></h:messages>


我知道它不会丢失,因为h:messages标记很好地显示了错误。。。我只是不知道如何将错误与特定的h:message标记联系起来。更改id也无济于事。我可以看到这将如何工作,但必须有一种更优雅的方式来处理错误消息!我必须承认,当我无法与h:message和rich:message交朋友阅读OP时,我已经决定做同样的事情,验证器模型不能应用于这种情况;将其注入会话作用域对象将是一个作用域泄漏。好的,谢谢,但我的意思是如果有其他方法可以使用@SessionScoped实现这一点。如何从视图中获取客户ID?
<f:view>
  <h:form>
    <h:commandButton id="mybutton" value="click"
      binding="#{showMessageAction.mybutton}"
      action="#{showMessageAction.validatePassword}" />
    <h:message for="mybutton" />
  </h:form>
</f:view>
/** Must be request scope for binding */
public class ShowMessageAction {

    private UIComponent mybutton;

    private boolean isOK = false;

    public String validatePassword() {
        if (isOK) {
            return "ok";
        }
        else {
            // invalid
            FacesMessage message = new FacesMessage("Invalid password length");
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(mybutton.getClientId(context), message);
        }
        return null;
    }

    public void setMybutton(UIComponent mybutton) {
        this.mybutton = mybutton;
    }

    public UIComponent getMybutton() {
        return mybutton;
    }
}
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage( null, new FacesMessage( "The message to display in client" ));            
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Authentication failed", null);
            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, message);      
            <h:messages></h:messages>