2011-02-08 3 views
0

У меня есть этот компонент:валидатор не стреляя

<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> 

Я объявленный валидатор в гранях конфигурации:

<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"); 

     } 
    } 

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

У вас есть идеи?

Спасибо.

+0

Таким образом, вы нажимаете кнопку отправки, и проверка не срабатывает? –

+0

Я ничего не нажимаю ... partialSubmit и непосредственный атрибут компонента inputText знают, чтобы сделать POST автоматически ... –

+0

Является ли это опечаткой или вы действительно написали 'instantiat' вместо' instant'? – ccheneson

ответ

1

Валидаторы JSF вызываются во время проверки фаз. Они не вызываются только тогда, когда управление потеряло фокус. См. lifecycle.

+0

Да, но я положил немедленное значение = true (использование непосредственного атрибута для компонента означает, что его значение будет проверено во время запроса заявки значения фазы в жизненном цикле JSF.) и все еще не срабатывает. –

0

несколько вещей ... Не стоит последняя часть вашего кода будет как

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

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

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

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

Смежные вопросы