FacesMessage不接受浏览器clientID

时间:2014-06-17 13:54:34

标签: java jsf primefaces

我有几个<p:messages>元素应该处理由单个bean产生的不同类型的错误。现在我从浏览器获取的一个元素的clientID总是相同的,因为里面没有生成的id(总共有3个ID)。

无论我传递给FacesContext.addMessage()的哪个clientID,我总是会在每个 <p:messages>元素上显示所有错误消息。

浏览器中的一个clientID:regelDetailAccordion:duoDlgForm2:regelDetail
浏览器中的另一个clientID:regelDetailAccordion:duoDlgForm1:messagesNeuerFehler
Bean代码:FacesContext.getCurrentInstance().addMessage(X, new FacesMessage(...));
其中X是clientID(非)前面有:和/或regelDetail前面有和没有:的情况。尝试了所有:(

对话框的文件:

<ui:insert name="insertDuo"><ui:include src="/includes/duoRegelStmt.xhtml" />
</ui:insert>

显示我所有messages的对话框:

    <p:dialog widgetVar="newDuoDialog" id="newDuoDlg" modal="true">
        <p:layout id="layout">
            <p:layoutUnit position="west">
                <ui:insert name="insertDetailStmt">
                    <h:form id="stmtDetailForm">
                        <ui:include src="/includes/stmtDetail.xhtml" /> <!-- left side -->
                    </h:form>
                </ui:insert>
            </p:layoutUnit>

            <p:layoutUnit position="center">
                <ui:insert name="insertDetailRegel">
                    <ui:include src="/includes/regelDetail.xhtml"/> <!-- right side -->
                </ui:insert>
            </p:layoutUnit>
        </p:layout>
    </p:dialog>

对话框的右侧显示我的3 messages中的2个:

<ui:composition>
    <h:panelGrid id="unterheaderUndAccordion">
        <h:panelGrid rendered="#{...}" id="regelUnterheader"/>
        <p:accordionPanel multiple="true" activeIndex="0,1" id="regelDetailAccordion" rendered="#{...}">
            <p:tab>
                <h:form id="duoDlgForm1">
                    <ui:insert name="neuerFehler">
                        <ui:include src="/includes/neuerFehler.xhtml" />
                    </ui:insert>

                    <h:selectOneMenu value="#{regelBean.selectedFehlerCode}" id="selFCode"
                        onChange="submit()" process="@this" valueChangeListener="#{regelBean.changeFehlerCode}">
                        <p:ajax event="change" update="duoDlgForm1" />
                        <f:selectItems ... />
                    </h:selectOneMenu>
                </h:form>
            </p:tab>
            <p:tab>
                <h:form id="duoDlgForm2">
                    <h:panelGrid>
                        <p:messages id="regelDetail" showDetail="true" closable="true"/>
                    </h:panelGrid>
                </h:form>
            </p:tab>
        </p:accordionPanel>
    </h:panelGrid>
</ui:composition>

neuerFehler包含一个messages,其定义如下

<p:messages id="messagesNeuerFehler" showDetail="true" closable="true"/>

在我的想法中,当我为X输入正确的值时,只有正确的消息字段才会显示消息,即使其他messages已更新。如果是这样,我必须输入正确的clientID是什么?非常感谢,我很快就结束了:(

Screeny

2 个答案:

答案 0 :(得分:1)

如果我正确理解了问题,您可以使用Primefaces选择器阻止某些组件更新,如下所示:

<h:form>
    <h:inputText ... />
    <h:inputText ... />
    <h:inputText ... styleClass="noupdate" />
    <h:inputText ... />
    <h:inputText ... />
    <p:commandButton ... update="@(form :not(.noupdate))"/>
</h:form>

BalusC here的原始答案。

如果这没有帮助,您可以在消息组件上使用for-attribute吗?在我看来,当它是具有错误的组件的标识符时,您希望FacesMessage中的clientid成为消息组件的标识符。对不起,如果我误解了。

答案 1 :(得分:0)

尝试使用

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Your message"));

并向组件添加update="elementId"属性,从而触发托管bean操作。

“elementId”当然是您<p:messages>元素的相应ID。

对我来说这样做很好。也许它也解决了你的问题。