Валидатор не стреляет - PullRequest
0 голосов
/ 08 февраля 2011

У меня есть этот компонент:

<ice:form style="width: 45%;" partialSubmit="true" >
    <ice:inputText id="cc" required="true" partialSubmit="true" immediate="true"
        value="#{userAction.username}">
        <f:validator validatorId="passwordValidator" />
        <ice:message style="color: red;" id="ageError" for="cc" />
    </ice:inputText>
</ice:form>

Я объявил валидатор в лицах config:

<validator>
    <validator-id>passwordValidator</validator-id>
    <validator-class>com.mydomain.seam_icefaces_test.action.PasswordValidator</validator-class>
</validator>

И валидатор Java-класса:

   package com.mydomain.seam_icefaces_test.action;

import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

    import org.jboss.seam.faces.FacesMessages;

    public class PasswordValidator implements Validator {

        @Override
        public void validate(FacesContext arg0, UIComponent arg1, Object value)
                throws ValidatorException {
            String val = (String) value;

            if (val.length() == 0)
                ((UIInput) arg1).setValid(false);
            FacesMessages.instance().addToControlFromResourceBundle(arg1.getId(),
                    "invalid.password");

        }
    }

Я не понимаю, почему это не стрельба, когда он теряет фокус ....

У тебя есть идея?

Спасибо.

Ответы [ 2 ]

1 голос
/ 08 февраля 2011

Валидаторы JSF вызываются во время проверки. Их не вызывают только тогда, когда контроль потерял фокус. См. жизненный цикл .

0 голосов
/ 08 февраля 2011

Несколько вещей ... Разве последняя часть вашего кода не должна походить на

if (val.length() == 0)
{
    ((UIInput) arg1).setValid(false);
    FacesMessages.instance().addToControlFromResourceBundle(arg1.getId(),
                    "invalid.password");
}

? Возможно, именно поэтому ваше сообщение не отображается.

Во-вторых, атрибут Immediate не обязателен. Вы можете попробовать работать без него.

Наконец, попробуйте использовать атрибут validator="#{MyBean.validatePassword}" в теге <ice:inputText>, где validatePassword - это копия метода validate из класса PasswordValidator.

...