首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在EL/Facelet中找不到具有默认名称的@命名CDI

在EL/Facelet中找不到具有默认名称的@命名CDI
EN

Stack Overflow用户
提问于 2013-10-16 22:00:20
回答 1查看 2.6K关注 0票数 4

jee6教程中,我可以读到以下内容:

@ name限定符允许您使用bean名称访问bean,其中第一个字母为小写。例如,Facelets页面会将bean称为打印机。 可以为@命名限定符指定一个参数以使用非默认名称:

但是,当我尝试使用@Named而不添加参数时,我的bean就找不到了,我得到的异常如下所示。

代码语言:javascript
运行
复制
@Named
@ViewScoped
public class MTestBean {
...
}

例外情况;

代码语言:javascript
运行
复制
javax.servlet.ServletException: /MyPage.xhtml @15,65 listener="#{mTestBean.init}": Target Unreachable, identifier 'mTestBean' resolved to null

但如果我用

代码语言:javascript
运行
复制
@Named("mTestBean")

一切都很好。这是预期的行为吗?有没有一种方法可以列出EL中可用的bean,也许我使用的是错误的默认名称?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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名称,而不仅仅是类。

代码语言:javascript
运行
复制
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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19414709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档