未找到Validator方法

时间:2011-12-14 16:09:51

标签: validation jsf-2

我正在编写一个JSF页面,用户可以在其中更改密码。我的解决方案基于David Geary和Cay S. Horstmann撰写的JavaServer Faces(第3版)书中的代码示例。这是我的代码:

<h:inputText id="oldPassword" required="true"
    validator="#{accountBean.validateOldPassword}">
    <f:ajax event="blur" render="oldPasswordError" />
</h:inputText>
<h:message for="oldPassword" id="oldPasswordError" style="color: red" />

AccountBean.java 的一部分:

@Named("accountBean")
@SessionScoped
public class AccountBean implements Serializable {
    private String login;
    private String password;

    (...)
    public void validateOldPassword(FacesContext context, UIComponent component, Object value) {
        if (!(((String)value).equals(password)))
            throw new ValidatorException(new FacesMessage("Invalid password"));
    }
}

现在,当我将其部署到JBoss AS 7.0.2并尝试使用时,我会在旧密码字段附近呈现此类错误:

/changePassword.xhtml @28,54 validator="#{accountBean.validateOldPassword}": Method not found: pl.edu.pw.mini.smartdialer.presentation.AccountBean@d1ff44.validateOldPassword(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)

它声称方法无法找到,为什么? 这几乎是从书中复制/粘贴,仍然无法正常工作。 我不知道在哪里找到一个bug。你能帮帮我吗?

1 个答案:

答案 0 :(得分:1)

根据评论,CDI注释似乎根本不起作用。

要使它们正常工作,您需要将beans.xml文件放在/WEB-INF文件夹中。该文件可以留空。恰好在该位置存在具有该名称的文件就足以使容器开始扫描具有CDI注释的类。

如果这些类在JAR文件中,而该文件又包含在/WEB-INF/lib中,那么您应该将该文件放在JAR的/META-INF文件夹中。

这样做是为了避免在容器启动期间对注释进行不必要的扫描。扫描整个类路径以进行注释是一项相对昂贵的工作,可能会减慢容器的启动速度。这就是为什么你需要beans.xml文件才能在每个WAR和每个JAR的基础上触发它。顺便提一下,JSF也使用faces-config.xml来应用相同的构造。如果WAR或JAR中不存在该文件,那么JSF也不会在WAR或JAR中扫描JSF特定的注释。