验证器没有开火

时间:2011-02-08 11:17:05

标签: java jsf icefaces

我有这个组件:

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

我在faces 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 个答案:

答案 0 :(得分:1)

在验证期间调用JSF验证器。当控制失去焦点时,它们不会被调用。请参阅lifecycle

答案 1 :(得分:0)

一些事情......代码的最后一部分不应该像

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

?这可能就是您的消息未显示的原因。

其次,Immediate属性不是必需的。没有它你可以尝试工作。

最后,尝试使用validator="#{MyBean.validatePassword}"标记中的<ice:inputText>属性,其中validatePassword是PasswordValidator类中validate方法的副本。