2012-02-26 2 views
3

У меня возникли проблемы с отображением ошибок проверки, которые запускаются компонентами ui, которые являются , вложенными в dataTable.Jsf 2, Отображение сообщений проверки внутри dataTable

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

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

<!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

Вы не поставили <h:message> для поля ввода в любом месте в datatable. Вам необходимо поставить

<h:message for="amount" /> 

где-то в списке данных именно там, где вы хотели бы их отображать.

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

+0

Foutje..edankt! Это было определенно слишком легко :) – chrisF

+0

Graag gedaan :) – BalusC

Смежные вопросы