我有这个组件:
<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");
}
}
我不明白为什么当它失去焦点时这不会被解雇....
你有什么想法吗?
感谢。
答案 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
方法的副本。