【问题标题】:Cant find @Named CDI bean with default name in EL/Facelet在 EL/Facelet 中找不到具有默认名称的 @Named CDI bean
【发布时间】:2013-10-25 05:37:04
【问题描述】:

jee6 tutorial我可以读到以下内容:

@Named 限定符允许您通过以下方式访问 bean 使用 bean 名称,第一个字母小写。例如, Facelets 页面会将 bean 称为打印机。

您可以为 @Named 限定符指定一个参数以使用 非默认名称:

但是,当我尝试在不添加参数的情况下使用 @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,也许我假设错误的默认名称?

【问题讨论】:

  • 您使用的是 JSF 2.0 还是 JSF 2.2? @Named@ViewScoped 不能一起使用,除非它是 JSF 2.2。
  • 在使用 isf 2.2 但我的 bean 的范围与问题 afaik 无关

标签: jsf-2 el cdi


【解决方案1】:

您实际上必须使用#{MTestBean.xxx} 来引用bean。有趣的是,NetBeans 对默认名称做出了相同的假设,并将使用 #{mTestBean.xxx} 自动完成。正如 BalusC 所指出的,这种命名行为确实遵循 JavaBeans 规范。从第 8.8 节 -

...支持偶尔使用所有 大写名称,我们检查 名称的前两个字符是否都是大写的,如果 所以别管它。例如, “FooBah”变成“fooBah” “Z”变成“z” “网址”变成“网址” 我们提供了一个方法 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());
        }
    }

以及我们的测试 bean 的输出 -

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

【讨论】:

  • 这绝对不是问题/错误。 Javabeans 规范中完全指定了该行为。如果您链接并引用相关部分,您将获得支持。
  • 感谢您的提示。我想唯一的问题是 IDE 做出了同样的错误假设。
  • 很好,这解释了它。只是烦人的是 cdi 和 jsf-beans 之间的默认名称不同
  • ide 道具。假设 jsf-beans
  • @AkselWillgert 好点。我没有意识到 JSF @ ManagedBean 会生成“mTestBean”,但快速测试证明了这一点。我认为 JSF 和 CDI 实现了关于 mbean 的相同基本规范。
猜你喜欢
  • 2017-10-19
  • 2015-08-12
  • 1970-01-01
  • 2013-03-02
  • 2015-09-03
  • 2012-05-04
  • 2013-03-03
  • 2012-04-12
相关资源
最近更新 更多