这个问题在这里已经有了答案:
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();
// ...
也可以看看:
关于validation - 如何在自定义验证器中获取另一个组件的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7608145/