Jsf 2, отображение сообщений проверки в dataTable - PullRequest
3 голосов
/ 26 февраля 2012

У меня проблема с отображением ошибок валидации, которые вызываются компонентами пользовательского интерфейса, вложенный в таблицу данных.

Вот страница xhtml, которая содержит форму со статической верхней частью, где можно ввести адрес.

Ниже показаны позиции заказа, где пользователи могут вводить суммы товаров, которые они хотели бы заказать. Эти элементы извлекаются из таблицы базы данных и отображаются внутри таблицы данных.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">

<ui:composition template="../templates/_standard.xhtml">    

    <ui:define name="pageHeadline">
            #{msg['supplies.module_headline']}
    </ui:define>

    <ui:define name="pageContent">

        <h:form id="supplies" styleClass="editForm" rendered="#{!suppliesHandler.sent}">
            <h:panelGrid
                    columns="2"
                    columnClasses="tdLabel,tdValue"
                    rowClasses="row"
                    styleClass="leftPane"
                    > 

                    <!-- row 1 -->
                    #{msg['supplies.account']}:
                    <h:panelGroup>
                        <h:inputText id="account" value="#{supply.contact.account}" tabindex="1" styleClass="text"/>
                        <h:message for="account" styleClass="error"/>
                    </h:panelGroup>

                    <!-- row 2 -->
                    #{msg['supplies.company']}:
                    <h:panelGroup>
                        <h:inputText id="company" value="#{supply.contact.company}" tabindex="2" styleClass="text"/>
                        <h:message for="company" styleClass="error"/>
                    </h:panelGroup>             

                    <!-- row 3 -->
                    #{msg['supplies.street']}:
                    <h:panelGroup>
                        <h:inputText id="street" value="#{supply.contact.street}" tabindex="3" styleClass="text"/>
                        <h:message for="street" styleClass="error"/>
                    </h:panelGroup>             

                    <!-- row 4 -->
                    #{msg['supplies.postcode']}:
                    <h:panelGroup>
                        <h:inputText id="postcode" value="#{supply.contact.postcode}" tabindex="4" styleClass="text"/>
                        <h:message for="postcode" styleClass="error"/>
                    </h:panelGroup>

                    <!-- row 5 -->
                    #{msg['supplies.city']}:
                    <h:panelGroup>
                        <h:inputText id="city" value="#{supply.contact.city}" tabindex="5" styleClass="text"/>
                        <h:message for="city" styleClass="error"/>
                    </h:panelGroup>

                </h:panelGrid>

                <h:panelGrid
                    columns="2"
                    columnClasses="tdLabel,tdValue"
                    rowClasses="row"
                    styleClass="rightPane"
                    > 

                    <!-- row 2 -->
                    #{msg['supplies.contact']}:
                    <h:panelGroup>
                        <h:inputText id="contact" value="#{supply.contact.contact}" tabindex="6" styleClass="text"/>
                        <h:message for="contact" styleClass="error"/>
                    </h:panelGroup>

                    <!-- row 3 -->                      
                    #{msg['supplies.phone']}:
                    <h:panelGroup>
                        <h:inputText id="phone" value="#{supply.contact.phone}" tabindex="7" styleClass="text"/>
                        <h:message for="phone" styleClass="error"/>
                    </h:panelGroup>

                    <!-- row 4 -->  
                    #{msg['supplies.email']}:
                    <h:panelGroup>
                        <h:inputText id="email" value="#{supply.contact.email}" tabindex="8" styleClass="text">
                            <f:validator validatorId="com.abc.myproduct.be.ui.validator" />
                        </h:inputText>
                        <h:message for="email" styleClass="error"/>
                    </h:panelGroup> 

                    <!-- row 5 -->
                    #{msg['supplies.fax']}:
                    <h:panelGroup>
                        <h:inputText id="fax" value="#{supply.contact.fax}" tabindex="9" styleClass="text"/>
                        <h:message for="fax" styleClass="error"/>
                    </h:panelGroup>

                </h:panelGrid>

                <div class="spacer"></div>

                <h:dataTable id="items" 
                    styleClass="listing_large" 
                    value="#{supply.supplyItems}" 
                    headerClass="heading" 
                    var="item">
                    <h:column>
                        <f:facet name="header">
                            #{msg['supplies.id']}
                        </f:facet>
                        <h:outputText value="#{item.supply_id}" />
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            #{msg['supplies.amount']}
                        </f:facet>
                        <h:inputText value="#{item.amount}" id="amount" styleClass="text" size="3" maxlength="3" style="width:50px"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            #{msg['supplies.description']}
                        </f:facet>
                        <h:outputText value="#{item.description}" />
                    </h:column>
                </h:dataTable>

                <div><br/>
                    <h:messages globalOnly="true" layout="table"  styleClass="error"/>
                </div>

                <h:panelGrid
                    columns="1"
                    columnClasses="tdLabel,tdValue"
                    rowClasses="row">   

                    <!-- row 2 -->
                    <h:panelGroup>
                        <h:commandButton value="#{msg['general.submit']}" action="#{suppliesHandler.submitMessage}" styleClass="button"/>
                    </h:panelGroup>

                </h:panelGrid>          

            </h:form>
            <h:messages globalOnly="true" layout="table" rendered="#{suppliesHandler.sent}"/>

    </ui:define>

</ui:composition>
</html>

Проверка для адресной части формы работает отлично. Только сообщения для этой части формы не отображаются:

<h:dataTable id="items" 
                    styleClass="listing_large" 
                    value="#{supply.supplyItems}" 
                    headerClass="heading" 
                    var="item">
                    <h:column>
                        <f:facet name="header">
                            #{msg['supplies.id']}
                        </f:facet>
                        <h:outputText value="#{item.supply_id}" />
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            #{msg['supplies.amount']}
                        </f:facet>
                        <h:inputText value="#{item.amount}" id="amount" styleClass="text" size="3" maxlength="3" style="width:50px"/>
                    </h:column>
                    <h:column>
                        <f:facet name="header">
                            #{msg['supplies.description']}
                        </f:facet>
                        <h:outputText value="#{item.description}" />
                    </h:column>
                </h:dataTable>

Проверка выполняется через BeanValidation:

public class SupplyItem implements Serializable {

private static final long serialVersionUID = 1L;

@Id
private long supply_id;

private String description;
private int orderNo;

@Transient
@Max(value=200)
private int amount;

/*
 * constructor
 */
public SupplyItem() {
    super();
}

public long getSupply_id() {
    return supply_id;
}

public void setSupply_id(long supply_id) {
    this.supply_id = supply_id;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public int getOrderNo() {
    return orderNo;
}

public void setOrderNo(int orderNo) {
    this.orderNo = orderNo;
}

public int getAmount() {
    return amount;
}

public void setAmount(int amount) {
    this.amount = amount;
}

}

Это действительно проверяется, однако сообщения не отображаются ...

12:29:45,860 Information [javax.enterprise.resource.webcontainer.jsf.renderkit] (http--127.0.0.1-8080-2) WARNUNG: FacesMessage(s) wurde(n) in die Warteschlange gestellt, aber möglicherweise nicht angezeigt.
sourceId=supplies:items:0:amount[severity=(ERROR 2), summary=(Allowed maximum is 200), detail=(Allowed maximum is 200)]
sourceId=supplies:items:1:amount[severity=(ERROR 2), summary=(supplies:items:1:amount: 'a' must be a number consisting of one or more digits.), detail=(supplies:items:1:amount: 'a' must be a number between -2147483648 and 2147483647 Example: 9346)]

Попытка динамически установить идентификатор поля ввода в сочетании с h: message for = "" не работает, отображая его через h: messages globalOnly = "true".

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 26 февраля 2012

Вы не указали <h:message> для поля ввода нигде в таблице данных. Вам нужно поставить

<h:message for="amount" />

где-то в таблице данных именно там, где вы хотите их отобразить.

<h:messages globalOnly="true"> отображает только сообщения с null идентификатором клиента, так что, конечно, не будет работать вообще для сообщений с не null идентификатором клиента. Вам необходимо удалить globalOnly="true", чтобы отобразить сообщения, которые больше нигде не отображаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...