validation - 如何在自定义验证器中获取另一个组件的值?

标签 validation jsf components

这个问题在这里已经有了答案:





JSF doesn't support cross-field validation, is there a workaround?

(2 个回答)


6年前关闭。




我使用自定义验证器。困难在于我只需要检查两个字段 inputText 并比较它们。第一个字段必须大于第二个字段。如果没有,那么我必须显示一条包含错误信息的消息。所以我需要在我的自定义验证器中传递第一个 inputText 字段的值。为此,我需要读取验证器类中第一个 InputText 字段的值。如何在验证器类中获取必要组件的 ID?使用标签的解决方案不适合我。我需要直接转到所需的组件 也许这可以通过 FacesContext 的任何方法来完成?

最佳答案

只需通过 <f:attribute> 传递整个组件.

<h:form id="formId">
    <h:inputText value="#{bean.start}">
        <f:validator validatorId="rangeValidator" />
        <f:attribute name="endComponent" value="#{endComponent}" />
    </h:inputText>
    ...
    <h:inputText binding="#{endComponent}" value="#{bean.end}" />
    ...
</h:form>

(注意:binding 代码保持原样,不要让它引用 bean 属性!)

与验证器
UIInput endComponent = (UIInput) component.getAttributes().get("endComponent");
Object endComponentValue = endComponent.getSubmittedValue();
// ...

重要的一点是,组件按照它们在树中出现的顺序进行处理、转换和验证。任何尚未转换/验证的组件的提交值都可以通过 UIInput#getSubmittedValue() 获得。任何已经转换/验证的都可以通过 UIInput#getValue() 获得。 .因此,在您的特定示例中,您应该通过 UIInput#getSubmittedValue() 获得该值。而不是 UIInput#getValue() .

如果您想使用 UIInput#getValue() 提供的已转换和验证的值,那么您需要将验证器移动到第二个组件,然后传递第一个组件。
<h:form id="formId">
    <h:inputText binding="#{startComponent}" value="#{bean.start}" />
    ...
    <h:inputText value="#{bean.end}" />
        <f:validator validatorId="rangeValidator" />
        <f:attribute name="startComponent" value="#{startComponent}" />
    </h:inputText>
    ...
</h:form>
UIInput startComponent = (UIInput) component.getAttributes().get("startComponent");
Object startComponentValue = startComponent.getValue();
// ...

也可以看看:
  • JSF doesn't support cross-field validation, is there a workaround?
  • Error validating two inputText fields together
  • Validator for multiple fields
  • 关于validation - 如何在自定义验证器中获取另一个组件的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7608145/

    相关文章:

    java - 为我的网络应用程序编写授权过滤器(JSF 2.0)

    reactjs - 如何在 react.js 中仅在一个组件中导入 Bootstrap

    react-native - React Native - StackActions.reset 什么都不做

    delphi - 在 IDE 对象检查器中动态显示/隐藏属性?

    ruby-on-rails - rails 验证 : :allow_nil and :inclusion both needed at the same time

    ruby-on-rails - Rails 验证对象中的所有属性

    c - 从文本文件读取数据到链表,错误处理

    java - Jsf动态添加/删除c中的组件:forEach loop

    jsf - 获取复合组件本身的客户端 ID 以在 JavaScript 中使用

    javascript - REGEX 仅匹配有效的 EXCEL 列 (A-XFD)