Проверка JSF с составным компонентом не работает должным образом
Мой английский не очень хорош, извините за это. Мой вопрос касается проверки jsf. Когда мой компонент проверки вызывает ValidatorException, мой управляемый компонент 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}"/>
метод проверки в бине проверки.
@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"));
}
}
и мой метод сохранения бина.
@Override
public boolean save() {
super.save();
}
1 ответ
Вы работаете с Мохаррой ниже версии 2.1.10? Недавно была исправлена ошибка. Так что, если вы можете, обновите до последней версии 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 и использовании существующего EmailValidator, который поставляется с Hibernate Validator. В этом случае вам просто нужно установить аннотацию @Email над вашей собственностью.