Проверка 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 над вашей собственностью.

Другие вопросы по тегам