【问题标题】:JSF 2.0 Custom Validation problemJSF 2.0 自定义验证问题
【发布时间】:2011-07-08 22:30:32
【问题描述】:

我想在我的托管 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(s) 已入队,但可能尚未显示。 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.)]

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

【问题讨论】:

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


    【解决方案1】:

    你忘了给你的输入组件一个id。这就是&lt;h:message&gt;for 属性应该指向的位置。

    <h:inputText id="nameInput">
    

    与具体问题无关,您的方法很笨拙并且在技术上是错误的。根据规范,你应该抛出一个ValidatorException。所以不是

    ((UIInput) validate).setValid(false);
    context.addMessage(validate.getClientId(), msg);
    

    throw new ValidatorException(msg);
    

    那么 JSF 会担心将组件设置为无效并将消息添加到上下文中。


    还有第二个问题,您正在验证本地值而不是提交的值。

    替换

    nameMatcher = textPattern.matcher(getName());
    

    通过

    nameMatcher = textPattern.matcher(inputFromField);
    

    【讨论】:

    • 我只是按照你说的做了,但我没有在我的表单中看到任何输出,提示我输入了错误的输入。这就是控制台所说的:信息:警告:FacesMessage(s) 已入队,但可能尚未显示。 sourceId=bRegForm:name[severity=(ERROR 2), summary=(/WEB-INF/registerComposition.xhtml @14,132 validator="#{registrationController.validateName}": java.lang.NullPointerException), detail=(/WEB- INF/registerComposition.xhtml @14,132 validator="#{registrationController.validateName}": java.lang.NullPointerException)]
    • 仍然需要在输入组件中添加id="name"。然后可以找到&lt;h:message for="name"&gt;。我什至说过,“与具体问题无关” :) 顺便说一句,您引入了一个新问题,即 NPE。
    • 我更新了答案。将来,您应该提出一个新问题,而不是针对不同的问题重复使用同一个问题。
    • 抱歉,我刚刚更新了帖子。但我仍然在我的控制台中看到:INFO: WARNING: FacesMessage(s) has been enqueued,但可能没有显示。 sourceId=bRegForm:nameInput[severity=(ERROR 2), summary=(bRegForm:nameInput: Validation Error: Value is required.), detail=(bRegForm:nameInput: Validation Error: Value is required.)]
    • 要么页面未重新发布到服务器,要么您在idfor 中有错字(区分大小写),或者它们位于不同的页面/范围内。因此,例如将输入放在数据表中并将消息放在数据表之外是行不通的。
    猜你喜欢
    • 2013-12-06
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多