【问题标题】:primefaces p:messages are not displayedprimefaces p:不显示消息
【发布时间】:2016-05-24 21:02:11
【问题描述】:

我在表单中有一个按钮,我希望在单击此按钮时显示错误消息。这是我想在编写类似代码之前完成的一个步骤。我的代码不起作用,因为单击按钮时未显示错误消息。

我的表格是:

<h:form id="myForm">
    <p:messages id="errorMessage" for="myForm" autoUpdate="true" />
    <p:fieldset id="myFieldSet"
                style="margin-left:auto ; margin-right:auto ; width:98% ; height:90px;">
        <p:outputLabel for="numSi"
                       value="Value :"
                       style="margin-left:31px;margin-top:25px;" />
        <p:inputText id="numSi"
                     value="#{suppSiBean.researchValue}"
                     maxlength="9" required="true">
        </p:inputText>
        <p:commandButton id="suppSignaButton" type="submit" ajax="true"
                         value="Launch"
                         style="text-align: center ; height:45px; width:150px ; margin-top:20px;"
                        action="#{suppSiBean.lancerRequete()}" />
    </p:fieldset>
</h:form>

摘录我的豆子:

public void lancerRequete() {}
    FacesContext context = FacesContext.getCurrentInstance();
    //I'm intentionally hide the values of the three following variables because it's confidential
    ResourceBundle bundle = ...
    String message = ...
    String messageFormat = ...
    FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, messageFormat.toString(), "");
    FacesContext.getCurrentInstance().addMessage(getClientId("myForm"), facesMessage);
}

public String getClientId(String id) {
    FacesContext context = FacesContext.getCurrentInstance();
    UIViewRoot root = context.getViewRoot();
    UIComponent c = findComponent(root, id);
    LOGGER.info("c.getClientId(context) vaut :" + c.getClientId(context));
    return c.getClientId(context);
}

private UIComponent findComponent(UIComponent c, String id) {
    if (id.equals(c.getId())) {
        return c;
    }
    Iterator<UIComponent> kids = c.getFacetsAndChildren();
    while (kids.hasNext()) {
        UIComponent found = findComponent(kids.next(), id);
        if (found != null) {
            return found;
        }
    }
    return null;
}

【问题讨论】:

    标签: jsf primefaces


    【解决方案1】:

    为什么不在addMessage 方法中直接定位组件的ID?

    public void lancerRequete() {}
         ...
         FacesContext.getCurrentInstance().addMessage("errorMessage", facesMessage);
    }
    

    最后,您应该通过添加update 属性来告知何时更新此组件:

    <p:commandButton ... update="errorMessage" />
    

    【讨论】:

    • 已经有一个autoUpdate="true",你没有解释为什么它不起作用。错误在别处,您可以通过自己运行和调试提供的代码来找出它。
    • 当然是问题中的代码。您的代码工作正常,但没有解释 OP 的问题,也没有回答它。
    • 似乎autoUpdate 无法为他工作,但也许update="..." 可以并因此回答了他的问题。
    • 请使用这个:
    • 嗯,很多代码,但是 addMessage() 只需要一个引用 for= 属性的字符串和一个 FacesMessage。 ....addMessage("myForm", facesMessage); "myForm" 引用 for-attribute,而不是 form-id。您应该使用不同的名称。
    猜你喜欢
    • 2013-12-27
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多