2011-12-14 104 views
0

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

部分 AccountBean.java
<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" /> 

@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: [email protected]ateOldPassword(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object) 

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

+1

看起来不错。当然,你确实重建/重新部署了WAR并最终重新启动了服务器(或者服务器本身正确支持auto-hotdeploy)?没有该方法的旧类可能仍然在服务器的工作文件夹中。如果不能解决这个问题,那么为了消除可能的CDI噪声,请改用`javax.faces.bean`包中的`@ManagedBean @ SessionScoped`(或更好的方法``ViewScoped`)。 – BalusC 2011-12-14 16:22:57

回答

1

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

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

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

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