如何实现复合材料组件的跨领域验证?我使用的复合组件是一个输入文本框(一个用于电子邮件,另一个用于确认电子邮件)。我为confirmEmail组件应用了f:validator标签。如何在validate方法中获取电子邮件复合组件的值。是UIComponent还是UINamingContainer?
答案 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>
但是当我提交表单时,验证器没有被调用。我应该在组件周围包装验证器,还是这是正确的实现方式。