我对在JSF 2.0中自定义验证器中设置的消息有疑问。 这是代码
public void validate(FacesContext context, UIComponent component,
Object value) throws ValidatorException {
matcher = pattern.matcher(value.toString());
if(!matcher.matches()){
FacesMessage msg =
new FacesMessage("E-mail validation failed.",
"Invalid E-mail format.");
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(msg);
}
}
现在我很好奇它是如何工作的,因为我们没有编写代码的一部分 的 context.add(MSG)
如果没有在FacesContext中添加这些消息,它如何设法在UI上检索它?
答案 0 :(得分:4)
JSF在the UIInput#validateValue()
method中做到了这一点。它只是在try-catch
块内调用您的验证器,捕获ValidatorException
,从中提取FacesMessage
,最后将其添加到组件的客户端ID上的FacesContext
。
JSF实现是开源的。在Mojarra 2.1.3源代码中,您可以从UIInput
类的第1143行开始找到以下内容:
// If our value is valid and not empty or empty w/ validate empty fields enabled, call all validators
if (isValid() && (!isEmpty(newValue) || validateEmptyFields(context))) {
if (validators != null) {
Validator[] validators = this.validators.asArray(Validator.class);
for (Validator validator : validators) {
try {
validator.validate(context, this, newValue);
}
catch (ValidatorException ve) {
// If the validator throws an exception, we're
// invalid, and we need to add a message
setValid(false);
FacesMessage message;
String validatorMessageString = getValidatorMessage();
if (null != validatorMessageString) {
message =
new FacesMessage(FacesMessage.SEVERITY_ERROR,
validatorMessageString,
validatorMessageString);
message.setSeverity(FacesMessage.SEVERITY_ERROR);
} else {
Collection<FacesMessage> messages = ve.getFacesMessages();
if (null != messages) {
message = null;
String cid = getClientId(context);
for (FacesMessage m : messages) {
/* Here --> */ context.addMessage(cid, m);
}
} else {
message = ve.getFacesMessage();
}
}
if (message != null) {
/* And here --> */ context.addMessage(getClientId(context), message);
}
}
}
}
}
答案 1 :(得分:0)
jsf后面有一个catch异常,他正在检索你的消息..
如果这不能回答你的问题,我不明白你的问题...
也许此链接可以帮助您: http://java.dzone.com/articles/jsf-validation-tutorial-error
您还必须在jsf中设置错误的位置..