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

Mic*_*ael 6 validation jsf components

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

Bal*_*usC 11

只需通过整个组件<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>
Run Code Online (Sandbox Code Playgroud)

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

在验证器中

UIInput endComponent = (UIInput) component.getAttributes().get("endComponent");
Object endComponentValue = endComponent.getSubmittedValue();
// ...
Run Code Online (Sandbox Code Playgroud)

重要提示是组件按树中显示的顺序进行处理,转换和验证.任何未经转换/验证的组件的提交值都可以使用,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>
Run Code Online (Sandbox Code Playgroud)
UIInput startComponent = (UIInput) component.getAttributes().get("startComponent");
Object startComponentValue = startComponent.getValue();
// ...
Run Code Online (Sandbox Code Playgroud)

也可以看看: