我的英语不好,抱歉。我的问题是关于jsf验证。当我的验证bean抛出ValidatorException时,我的托管bean save_method工作。但我不希望我的save_method工作。如果电子邮件无效,我的save_method不应该工作。
复合界面
<composite:attribute name="validator" required="false"
method-signature="void Action(javax.faces.context.FacesContext, javax.faces.component.UIComponent,Object)" />
像那样的复合实现
<c:if test="#{cc.getValueExpression('validator')!=null}">
<p:inputText value="#{cc.attrs.value}" id="#{cc.attrs.id}"
required="#{cc.attrs.required}" validator="#{cc.attrs.validator}"/>
验证验证bean中的方法。
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
String email = (String) value;
Pattern mask = null;
mask = Pattern.compile(EMAIL_REGEX);
Matcher matcher = mask.matcher(email);
if (!matcher.matches()) {
messageManager.warn(MessageManager.Bundles.WO, "validator.message.email");
throw new ValidatorException(new FacesMessage("hoppala"));
}
}
和我的托管bean保存方法。
@Override
public boolean save() {
super.save();
}
答案 0 :(得分:3)
您是否正在使用版本2.1.10以下的mojarra?最近修复了was a bug。所以,如果可以,请更新到2.1.13的最新版本。但无论如何,在JSF中你不会按照你所描述的方式去做。我建议使用<f:validator/>
来应用验证器,如下所示:
<mytags:customInput value="#{validationModel.value}">
<f:validator for="input" validatorId="org.validationexample.EmailValidator" />
</mytags:customInput>
您的复合组件必须实现<cc:editableValueHolder>
:
<cc:interface>
<cc:attribute name="value"/>
<cc:editableValueHolder name="input" targets="inputText"/>
</cc:interface>
<cc:implementation>
<p:inputText id="inputText" value="#{cc.attrs.value}" />
</cc:implementation>
最后,您的验证由专用验证器类处理:
@FacesValidator("org.validationexample.EmailValidator")
public class EmailValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
// your validation here
}
}
无论如何,还有其他方法/口味。您也可以将<f:validator>
直接放入<p:inputText>
内的复合组件中。由于<f:validator>
具有disabled
属性,因此您可以根据需要禁用它。另一种方法是使用Bean Validation并使用Hibernate Validator附带的现有EmailValidator。在这种情况下,您只需要在属性上方设置注释@Email。