2011-12-14 103 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的註釋。