在jee6教程中,我可以读到以下内容:
@ name限定符允许您使用bean名称访问bean,其中第一个字母为小写。例如,Facelets页面会将bean称为打印机。 可以为@命名限定符指定一个参数以使用非默认名称:
但是,当我尝试使用@Named而不添加参数时,我的bean就找不到了,我得到的异常如下所示。
@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,也许我使用的是错误的默认名称?
发布于 2013-10-17 13:27:32
实际上,您必须使用#{MTestBean.xxx}引用bean。有趣的是,NetBeans对默认名称做了相同的假设,并将使用#{mTestBean.xxx}自动完成。正如BalusC所指出的,这种命名行为确实遵循JavaBeans规范。第8.8条-
...to支持偶尔使用所有大写名称,我们检查名称的前两个字符是否都是大写字母,如果是的话,不要使用。例如,“fooBah”变成“fooBah”“Z”变成“z”“URL”我们提供了实现此转换规则的方法Introspector.decapitalize。
至于在CDI中列出可用的bean,最好的选择是javax.enterprise.inject.spi.BeanManager。参见此链接
编辑:这是一个从链接中略作修改的版本,以显示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
https://stackoverflow.com/questions/19414709
复制相似问题