2013-10-16 18 views
4

jee6 tutorial我可以閱讀以下內容:不能找到@Named CDI豆與EL/facelet裏默認名稱

的@Named限定符允許您使用bean的名字由 訪問bean,這些第一個字母小寫。例如, Facelets頁面會將該bean引用爲打印機。

您可以指定的參數來@Named限定符使用 非缺省名稱:當我嘗試使用@Named不添加參數

然而,我的豆無法找到和我得到異常如下所示。

@Named 
@ViewScoped 
public class MTestBean { 
... 
} 

異常;

javax.servlet.ServletException: /MyPage.xhtml @15,65 listener="#{mTestBean.init}": Target Unreachable, identifier 'mTestBean' resolved to null 

但是,如果使用

@Named("mTestBean") 

,一切工作正常。這是預期的行爲?有沒有一種方法可以列出EL中可用的bean,也許我會假設錯誤的默認名稱?

+1

您是否使用JSF 2.0或2.2 JSF? '@ Named'和'@ ViewScoped'不能一起使用,除非它是JSF 2.2。 –

+0

使用isf 2.2但我的bean的範圍與問題無關afaik –

回答

6

實際上,您必須使用#{MTestBean.xxx}來引用bean。有趣的是,NetBeans對默認名稱做出了相同的假設,並將自動完成#{mTestBean.xxx}。正如BalusC指出的那樣,這種命名行爲確實遵循了JavaBeans規範。從第8.8節 -

...支持偶爾使用的所有 大寫的名字,我們檢查如果名字的前兩個字符都是大寫,如果 所以不要管它。例如, 「FooBah」變成「fooBah」 「Z」變成「z」 「URL」變成「URL」 我們提供了一種實現此轉換規則的Introspector.decapitalize方法。

至於用CDI列出可用的bean,最好的選擇是javax.enterprise.inject.spi.BeanManager。看到這個link

編輯:這是一個稍微修改從鏈接顯示EL名稱,不只是類的版本。

public void listAllBeans() throws NamingException{ 
     //Get the BeanManager 
     InitialContext initialContext = new InitialContext(); 
     BeanManager bm = (BeanManager) initialContext.lookup("java:comp/BeanManager"); 

     //List all CDI Managed Beans and their EL-accessible name 
     Set<Bean<?>> beans = bm.getBeans(Object.class,new AnnotationLiteral<Any>() {}); 
     for (Bean<?> bean : beans) { 
      System.out.println(bean.getBeanClass().getName() + "/bean name = " + bean.getName()); 
     } 
    } 

和輸出我們的測試豆 -

com.xxx.jsf.beans.MTestBean/bean名稱= MTestBean

+0

這絕對不是問題/錯誤。該行爲在Javabeans規範中完全規定。如果你鏈接並引用相關部分,你會得到upvote。 – BalusC

+0

感謝您的提示。我想唯一的問題是IDE做出同樣的錯誤假設。 – jdessey

+0

很好,這解釋了它。只是惱人的默認名稱不同cdi和jsf-beans –

相關問題