JSF 2.0自定义验证问题

时间:2011-03-04 15:50:28

标签: java validation jsf jsf-2 java-ee-6

我想在我的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。)]

它可能是什么?我忘了什么吗?我是否必须在配置文件中添加内容...?

1 个答案:

答案 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());