在<f:validator>之后调用<f:validaterequired>,它应该在</f:validator>之前</f:validaterequired>

时间:2013-11-26 16:21:37

标签: validation tomcat jsf-2

我读到<f:validateRequired>和组件属性requiredlike here之间没有区别:

  

强制执行值的验证程序。它与将UIInput上的必需属性设置为true具有相同的效果。

出于某种原因,我甚至不知道为什么,我的一位同事将required属性更改为<f:validateRequired>标记,并且它有一些负面的效果。

以下是所有代码(它还有许多其他内容,但可能很重要,我认为很清楚)

<h:inputText value="#{value}" id="#{id}" label="#{label}"
    converterMessage="#{msg['validation.digitOnly']}"
    styleClass="#{not component.valid ? invalidStyle : styleClass}"
    maxlength="#{empty maxLength ? validationProperties['validation.long.maxLenght'] : maxLength}">
    <f:converter converterId="intNumberConverter" />
    <f:validateRequired disabled="#{!required}" />
    <f:validateLength maximum="#{maxLength}" disabled="#{empty maxLength}" />
    <f:validator validatorId="#{validatorId}" />
    <f:attribute name="validation.bean" value="#{bean}" />

    <!-- validationProperties is a resource-bundle
            msg is a message-bundle

</h:inputText>

当我们使用required属性时,空字段的ajax验证首先进行,而uniquenessValidator(由#{validatorId}调用)根本没有被触发,验证立即停止required验证失败时。现在,我们的验证器首先出现,它因异常而失败,因为我们假设该字段是非空的。我知道在验证器中假设是错误的!但是我会更高兴知道为什么效果在每一步都不同我相信两种方式都是相同的。这让他们与众不同?是否建议在标签上使用属性以及为什么?

我正在使用

<context-param>
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
    <param-value>true</param-value>
</context-param>
使用Mojarra在Tomcat 7.0.47上

。如果需要更多配置信息,我很乐意分享它们。


我读了一些<f:validateRequired>在Tomcat上遇到问题的信息,但VALIDATE_EMPTY_FIELDS我认为这不是这种问题。


回答@BalusC问。此代码用作一种带有验证(模板)的通用输入文本字段。

<!-- intNumberInput.xhtml-->
<ui:composition>
    <rich:panel styleClass="#{styleClass}Panel inputWrapperPanel">
        <ui:param name="validatedInputId"
            value="#{(validatedComponentId == null || !bean.notValid) ? id : validatedComponentId}" />

        <c:if test="#{(not empty validatorId) and validatedComponentId == null}">
            <!-- inputText as above, but without label, converters ect. -->
            <h:inputText value="#{value}" id="#{id}">   
                <f:validateRequired disabled="#{!required}" />
                <f:validateLength maximum="#{maxLength}" disabled="#{empty maxLength}" />
                <f:validator validatorId="#{validatorId}" />
                <f:attribute name="validation.bean" value="#{bean}" />
            </h:inputText>
        </c:if>

        <!--  (...) here goes other options -->
</rich:panel>

在实际形式中它是这样的(我必须更改一些非英文名称以使其更具可读性):

<rich:dataTable value="#{installmentBean.installments}" var="payment"
    rowKeyVar="subtable">

    <rich:collapsibleSubTable value="#{payment.installment}" var="installment" expandMode="client" rowKeyVar="row">

    <ui:param name="newRow"
        value="#{installmentBean.newInstallmentIndex == row
                and installmentBean.indeksEdytowanejTabeli == subtable}" />

    <rich:column>
        <!-- NUMBER -->
        <ui:fragment rendered="#{not newRow}">
            <h:outputText value="#{installment.installmentPK.number}" />
        </ui:fragment>
        <ui:fragment rendered="#{newRow}">
            <ui:include src="/common/input/validation/intNumberInput.xhtml">
                <ui:param name="id" value="installmentNumberEdit" />
                <ui:param name="value" value="#{installmentBean.newObject.installmentPK.number}" />
                <ui:param name="required" value="#{true}" />
                <!-- maxlen.installment.number=18-->
                <ui:param name="maxLength" value="#{validationProperties['maxlen.installment.number']}" />
                <ui:param name="bean" value="#{installmentBean}" />
                <ui:param name="validatorId" value="uniquenessValidator" />
            </ui:include>
        </ui:fragment>
    </rich:column>

    <!-- other columns -->

    </rich:collapsibleSubTable>
</rich:dataTable>

0 个答案:

没有答案