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

时间:2011-09-30 09:01:29

标签: validation jsf components

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

2 个答案:

答案 0 :(得分: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>

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

with in validator

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();
// ...

另见:

答案 1 :(得分:0)

您可以使用输入字段'name属性从请求参数映射中获取其他字段的值。要获取输入字段的name属性,请执行视图源以查看生成的内容。见下面的例子。

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);            
    }
}