как установить сообщение об ошибке в p: сообщение внутри пользовательского интерфейса: повторить из резервного компонента

У меня есть форма, содержащая компонент inputText и сообщения.
Я хочу установить сообщение об ошибке из вспомогательного компонента, но не могу этого сделать.

Ниже мой html-код:

<h:form id="formId">
    <h:panelGrid id="repeater" columns="2">
        <h:outputText value="#{msg['label.appeal.case.reference.no']}" />

        <ui:repeat id="uirepeater" value="#{beanPage.list}" var="value" varStatus="status">
            <h:panelGrid columns="2">
                <p:inputText id="refNo" value="#{beanPage.list[status.index]}" />
                <p:message for="refNo" display="text" />                
            </h:panelGrid>
        </ui:repeat>
    </h:panelGrid>

    <p:commandButton id="btmAdd" actionListener="#{beanPage.addRow}" value="Add" update="@form" />
    <p:commandButton id="btmSubmit" actionListener="#{beanPage.submit}" value="Submit" update="@form" />
</h:form>

ниже код резервного компонента:

public void submit() {
    FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "test", "test");
    FacesContext.getCurrentInstance().addMessage(":formId:uirepeater:refNo", msg);
    FacesContext.getCurrentInstance().addMessage(":formId:uirepeater:0:refNo", msg);
}

person heng heng    schedule 24.02.2014    source источник


Ответы (2)


Это не будет работать с ui:repeat. Фактический идентификатор inputText не будет refNo, как вы могли подумать.

‹ ui:repeat › обеспечит уникальность идентификатора клиента сгенерированного компонента, добавив перед ним индекс строки. Он просто несколько раз рендерит один и тот же компонент, не создавая новых компонентов в дереве.

Вероятно, вам нужно использовать c:forEach, который генерирует несколько компонентов в дереве.

Для получения дополнительной информации см.:

https://rogerkeays.com/jsf-c-foreach-vs-ui-repeat

Как установить идентификатор компонента/тега внутри ui:repeat

person Emil Kaminski    schedule 24.02.2014

Попробуйте это, я использую Primefaces 4.0, ViewScope, запрос Ajax. С помощью p:component получите ClientId атрибута p:messages for="someComponent" и передайте это значение bean-компоненту через p:remoteCommand, позже вы сможете установить сообщение из bean-компонента с ClientId. В какой-то элемент добавить это

    onclick="rc([{name:'index',value:#{item.index}},{name:'msg1',value:'#{p:component('someComponent')}'}])"

Создайте p:remoteCommand, чтобы установить идентификатор

<p:remoteCommand process="@this" name="rc" action="#{bean.someMethod}"/>    

public void someMethod(){
FacesContext context = FacesContext.getCurrentInstance();
            Map<String,String> params = context.getExternalContext().getRequestParameterMap();
            int index=Integer.parseInt(params.get("index"));
            this.msg[index]=params.get("msg1");
}

Теперь вы можете установить сообщения из бина:

FacesContext.getCurrentInstance().addMessage(this.msg[x], new FacesMessage(FacesMessage.SEVERITY_ERROR,null,"someMessage"));
person Community    schedule 30.07.2015