复合组件的交叉字段验证

时间:2011-03-22 13:19:43

标签: validation jsf jsf-2 composite-component

如何实现复合材料组件的跨领域验证?我使用的复合组件是一个输入文本框(一个用于电子邮件,另一个用于确认电子邮件)。我为confirmEmail组件应用了f:validator标签。如何在validate方法中获取电子邮件复合组件的值。是UIComponent还是UINamingContainer?

2 个答案:

答案 0 :(得分:0)

从技术上讲,你的复合是一个UINamingcontainer,但任何组件都可以找到它的子组件。

我怀疑以下内容应该有效

public void validate(FacesContext context, UIComponent component, Object value) {
    UIInput first = (UIInput)component.findComponent("compositesFirstInputID");
    UIInput second = (UIInput)component.findComponent("compositessecondInputID");

    Object firstEntry = first.getSubmittedValue();
    Object secondEntry = second.getSubmittedValue();
    if(!firstEntry.equals(secondEntry))
        throw new ValidatorException(...);
}

可能想添加一些空检查,可能是trim()并使用equlasIgnoreCase。

答案 1 :(得分:0)

我已经实现了如上所述的验证方法。我认为我的代码的问题是在复合组件上使用f:validate标签的位置。

<eg:inputText id="confirmEmail" value="backingbean.email"/>

<eg:inputText id="email" value="backingbean.email">
<f:validator validatorId="core.jsf.CompareValidator" for="inputText"/>
</eg:inputText>

但是当我提交表单时,验证器没有被调用。我应该在组件周围包装验证器,还是这是正确的实现方式。