简体   繁体   English

Jsf 2,在dataTable中显示验证消息

[英]Jsf 2, Displaying validation messages inside dataTable

I have a problem displaying validation errors that are triggered by ui components which are nested inside a dataTable. 我在显示由嵌套在dataTable中的ui组件触发的验证错误时遇到问题。

Here is the xhtml page, which contains a form with a static upper part, where an address can be entered. 这是xhtml页面,其中包含一个带有静态上半部分的表单,其中可以输入地址。

Below that it shows order items where users can enter amounts of items they would like to order. 下面显示了订单商品,用户可以在其中输入他们想要订购的商品数量。 These items are being retrieved from a database table and are diplayed inside a dataTable. 这些项目正在从数据库表中检索并显示在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>

Validation for the address part of the form works perfect. 验证表单的地址部分是完美的。 Only the messages for this part of the form are not being displayed: 仅显示此部分表单的消息:

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

Validation is being carried out through BeanValidation: 验证正在通过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;
}

} }

It gets actually being validated, however the messages are not being displayed... 它实际上得到了验证,但是没有显示消息......

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)]

Trying to set the id of the input field dynamically in conjunction with ah:message for="" did not work,displaying it through h:messages globalOnly="true" neither. 尝试动态设置输入字段的id与ah:message for =“”不起作用,通过h:messages globalOnly =“true”显示它。

Any help would be highly appreciated. 任何帮助将受到高度赞赏。

You have not put a <h:message> for the input field anywhere in the datatable. 您没有在数据表中的任何位置为输入字段添加<h:message> You need to put a 你需要放一个

<h:message for="amount" />

somewhere in the datatable exactly there where you'd like to display them. 在数据表的某个地方,你想要显示它们。

The <h:messages globalOnly="true"> only displays messages with a null client ID, so that surely won't work at all for messages with a non- null client ID. <h:messages globalOnly="true">仅显示具有null客户端ID的消息,因此对于具有非null客户端ID的消息肯定不起作用。 You'd need to remove globalOnly="true" in order to display messages which are not shown anywhere else. 您需要删除globalOnly="true"才能显示其他地方未显示的消息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM