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

Posted

技术标签:

【中文标题】如何在自定义验证器中获取另一个组件的值? [复制]【英文标题】:How to get the value of another component in a custom validator? [duplicate] 【发布时间】:2011-11-28 07:39:07 【问题描述】:

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

【问题讨论】:

我推荐阅读BalusC tutorial 不幸的是,这个解决方案不适合我,因为使用 并不能解决我的问题。我需要使用组件id直接在Validator-class中获取组件的值 【参考方案1】:

只需通过<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

【讨论】:

【参考方案2】:

您可以使用输入字段的名称属性从请求参数映射中获取其他字段的值。要获取输入字段的名称属性,请查看源代码以查看生成的内容。请参见下面的示例。

public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException 
    String newPassword = fc.getExternalContext().getRequestParameterMap().get("centerForm:newPassword");
    String newPassword2 = (String) o;
    if(!newPassword.equals(newPassword2))
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"New Passwords do not match", null);            
        throw new ValidatorException(msg);            
    

【讨论】:

以上是关于如何在自定义验证器中获取另一个组件的值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在自定义操作之前安装组件

微信小程序如何将接口获取的数据传递给自定义组件

如何在自定义模块(Joomla 1.7)中使用自定义组件中的函数?

在自定义组件上使用 v-for,我可以访问组件内部的 ":key" 的值吗?

在自定义组件中获取spring底层组件

如何在自定义 Spring security 3.0 身份验证中正确处理异常?