我想在我的Managed bean中验证我的JSF页面的输入,但由于某种原因它不起作用?
@ManagedBean
@RequestScoped
public class RegistrationController {
//values passed from the JSF page
private String name;
...
public void validateName(FacesContext context, UIComponent validate,
Object value) {
String inputFromField = (String) value;
String simpleTextPatternText = "^[a-zA-Z0-9]+$";
Pattern textPattern = null;
Matcher nameMatcher = null;
textPattern = Pattern.compile(simpleTextPatternText);
nameMatcher = textPattern.matcher(getName());
if (!nameMatcher.matches()) {
((UIInput) validate).setValid(false);
FacesMessage msg = new FacesMessage(
"your name cant contain special characters");
context.addMessage(validate.getClientId(), msg);
}
}
这是输入组件的外观(在表单内):
<h:inputText value="#{registrationController.name}" validator="#{registrationController.validateName}" required="true">
<h:message for="nameInput"/>
当我输入错误的输入时,我看不到验证消息,在控制台中我看到了:
INFO:实例化org.hibernate.validator.engine.resolver.JPATraversableResolver的实例。 信息:警告:FacesMessage已入队,但可能尚未显示。 sourceId = bRegForm:j_idt7 [severity =(ERROR 2),summary =(bRegForm:j_idt7:Validation Error:Value is required。),detail =(bRegForm:j_idt7:Validation Error:Value is required。)]
它可能是什么?我忘了什么吗?我是否必须在配置文件中添加内容...?
答案 0 :(得分:4)
您忘了给输入组件id
。这就是for
的{{1}}属性应该指向的地方。
<h:message>
与具体问题无关,你的方法很笨拙,在技术上是错误的。根据规范,你应该抛出一个ValidatorException
。而不是
<h:inputText id="nameInput">
DO
((UIInput) validate).setValid(false);
context.addMessage(validate.getClientId(), msg);
然后JSF会担心将组件设置为无效并将消息添加到上下文中。
还有第二个问题,即您正在验证本地值而不是提交的值。
替换
throw new ValidatorException(msg);
通过
nameMatcher = textPattern.matcher(getName());