【问题标题】:JSF 2.2 custom validator not triggered in ui:repeatJSF 2.2 自定义验证器未在 ui:repeat 中触发
【发布时间】:2015-12-01 19:02:09
【问题描述】:

经过一段绝望的试验和错误之后,我来找你寻求帮助,因为现在我什至不确定我是否做错了。

我下面的代码在只读输入文本框中显示用户配置文件中的一些字段。数据来自作为“字段”对象的 ArrayList 的 bean,其属性在 ui:param 指令中描述。 用户可以单击框旁边的解锁/锁定按钮来开始/完成编辑她的数据。 我想在用户编辑后按回车或单击锁定按钮时触发输入验证。

但无论我尝试什么,在编辑并按下回车键或单击按钮后,更改的值都不会写回,我的自定义验证器也不会触发。不知何故,单击按钮后,然后呈现的输入框似乎未绑定到该字段?但是,如果在始终呈现的输入文本中使用验证器(并且所有属性都传递给它),则验证器可以工作 - 我不明白它:)

请看一下。如果我没有很好地解释我的意图,或者如果您需要更多代码,请告诉我。

编辑:backing bean 的注解:

@ManagedBean( name = "beanProfile" )
@RequestScoped

jsf代码:

<ui:composition>
    <ui:param name="i18n" value="#{field.i18n}" />
    <ui:param name="val" value="#{field.value}" />
    <ui:param name="req" value="#{field.required}" />
    <ui:param name="min" value="#{field.min}" />
    <ui:param name="max" value="#{field.max}" />
    <ui:param name="validationType" value="#{field.validationType}" />
    <ui:param name="useHidden" value="#{field.hidden}" />
    <ui:param name="locked" value="#{field.locked}" />
    <ui:param name="fullName" value="#{beanProfile.name}" />

    <h:form id="profileFrm">
        <h:outputText value="#{msg.role_profile}&nbsp;" styleClass="headingOutputText" />
        <h:outputText value="#{fullName}" styleClass="headerTitle" />
        <p />           
        <h:panelGroup>
            <ui:repeat var="field" value="#{beanProfile.userFields}">
                <h:panelGrid columns="2">
                    <h:outputText value="#{msg[i18n]}" styleClass="headerTitle" />
                    <h:message showDetail="true" for="visInput" styleClass="warn"
                        rendered="#{!useHidden}" />
                    <h:message showDetail="true" for="invisInput" styleClass="warn"
                        rendered="#{useHidden}" />
                </h:panelGrid>
                <h:panelGrid columns="2" columnClasses="nameColumn">
                    <h:inputText id="visInput" required="true" value="#{val}"
                        rendered="#{!useHidden}" readonly="#{locked}" >
                        <f:validator validatorId="customValidator" />
                        <f:attribute name="requiredField" value="#{req}" />
                        <f:attribute name="minLen" value="#{min}" />
                        <f:attribute name="maxLen" value="#{max}" />
                        <f:attribute name="type" value="#{validationType}" />
                    </h:inputText>
                    <h:inputSecret id="invisInput" required="true" value="#{val}"
                        rendered="#{useHidden}" readonly="#{locked}">
                        <f:validator validatorId="customValidator" />
                        <f:attribute name="requiredField" value="#{req}" />
                        <f:attribute name="minLen" value="#{min}" />
                        <f:attribute name="maxLen" value="#{max}" />
                        <f:attribute name="type" value="#{validationType}" />
                    </h:inputSecret>
                    <h:commandLink id="lock" action="#{beanProfile.lock(field)}"
                        rendered="#{!locked}" title="#{msg.profile_lock}">
                        <h:graphicImage height="16" width="16"
                            name="images/padlock_unlocked.svg" alt="#{msg.profile_lock}" />
                    </h:commandLink>
                    <h:commandLink id="unlock" action="#{beanProfile.unlock(field)}"
                        rendered="#{locked}" title="#{msg.profile_unlock}">
                        <h:graphicImage height="16" width="16"
                            name="images/padlock_locked.svg" alt="#{msg.profile_unlock}" />
                    </h:commandLink>
                </h:panelGrid>
            </ui:repeat>
        </h:panelGroup>
        <p />
        <h:commandButton id="submitProfileBtn" value="#{msg.cmd_submit}"
            styleClass="button" includeViewParams="true"
            action="#{beanProfile.submitProfile()}" />
    </h:form>
</ui:composition>

【问题讨论】:

  • 您是否显示了应用于beanProfile 支持bean 的注释?
  • 更改为 ViewScoped 范围,包 javax.faces.view
  • 我遇到了这个错误:CDI @ViewScoped manager 不可用
  • 更改为 javax.faces.bean

标签: jsf-2


【解决方案1】:

问题的根源是您正在为包含模型的支持 bean 使用 RequestScoped 范围,因此当您想要执行回发请求以执行支持 bean 方法时,绑定就消失了(不在服务器内存),并且 JSF 生命周期未按预期执行。解决方案是使用更长的范围作为 ViewScoped 范围。理想情况下,您应该使用与 CDI 兼容的 viewScoped 范围,因此您必须使用 JSF 2.2.x 版本。

【讨论】:

    【解决方案2】:

    谢谢lametaweb,你把我引向了正确的方向。

    由于无法使用@ViewScoped 注释,我找到了链接

    how-to-install-cdi-in-tomcat

    并按照 BalusC 的指示在 Tomcat 中使用 CDI。然后我不得不让所有的java类实现Serializable接口。

    现在我可以使用@ViewScoped 注释并触发验证器。

    【讨论】:

    • 您好,很高兴您解决了问题。我已经为最初的问题写了一个答案,请接受它。要将答案标记为已接受,请单击答案旁边的复选标记以将其从空心切换为绿色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多