【问题标题】:Validator method not found未找到验证器方法
【发布时间】:2011-12-14 16:09:51
【问题描述】:

我正在编写一个 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)

它声称找不到方法,为什么? 这几乎是从书中复制/粘贴的内容,但仍然无法正常工作。 我不知道在哪里可以找到错误。你能帮帮我吗?

【问题讨论】:

  • 看起来不错。确定您确实正确地重建/重新部署了 WAR 并最终重新启动了服务器(或者服务器本身正确地支持自动热部署)?没有该方法的旧类可能仍位于服务器的工作文件夹中。如果这不能解决问题,那么为了消除可能的 CDI 噪音,请尝试使用 javax.faces.bean 包中的 @ManagedBean @SessionScoped(或更好的 @ViewScoped)。
  • 有什么反馈吗?在过去的 7 个小时里,我看到你多次上线。如果您不提供任何反馈,我们应该如何回答这个问题?我还查看了您的问题历史,发现您基本上对 CDI 有疑问。它似乎在任何情况下都不起作用。因此,再次排除一个和另一个,请用 JSF 注释替换 CDI 注释并重试。如果这在所有情况下都有效,那么对您当前以及可能所有其他问题的明确答案应该足够简单。
  • 现在,我辞去了 CDI 注释的工作。我使用@ManagedBean 和@ManagedProperty 注释成功了,所以我认为现在不是我使用CDI 的时候。

标签: validation jsf-2


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 2015-12-27
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多