【问题标题】:Inject a EJB into a JSF converter with JEE6 [duplicate]使用 JEE6 将 EJB 注入 JSF 转换器 [重复]
【发布时间】:2011-01-02 10:23:52
【问题描述】:

我有一个访问我的数据库的无状态 EJB。 我需要 JSF 2 转换器中的这个 bean 来从 String 值参数中检索实体对象。我将 JEE6 与 Glassfish V3 一起使用。

@EJB 注释不起作用并获得 NPE,因为它在 faces 上下文中并且无法访问 EJB 上下文。

我的问题是: 是否仍然可以使用 @Resource 或其他注释或 JNDI 查找来注入此 bean,或者我需要解决方法吗?


解决方案

像这样进行 JNDI 查找:

  try {
   ic = new InitialContext();
   myejb= (MyEJB) ic
     .lookup("java:global/xxxx/MyEJB");   
  } catch (NamingException e) {
   e.printStackTrace();
  }

【问题讨论】:

    标签: jsf dependency-injection jakarta-ee glassfish ejb-3.0


    【解决方案1】:

    我从未使用过 JSF 2.0(只有 1.0),但规范的第 5.4 章说:

    [...] 允许容器注入对 在 JSF 应用程序可以访问之前,将容器托管资源放入托管 bean 实例中。 只有 beans 声明在请求中, 会话或应用范围是 有资格进行资源注入。

    但就我所知,JNDI 查找应该可以解决问题。

    【讨论】:

    • JNDI 查找不起作用。我尝试了 @EJB(mappedName="java:global/myProject/myEJB") ,其中的值是 glassfish 在部署时在控制台中输出为我的 EJB 的“可移植 JNDI 名称”的值
    • 不要使用@EJB注解。使用 InitialContext 获取目标组件。
    • @Bozho:InitialContext 有效! :) 谢谢
    • @bugspy.net: 还停留在过去的 J2EE 时代,无知吗?
    【解决方案2】:

    其他(但不是很漂亮)的解决方案可能是使用绑定而不是 convertId。仅使用 JSF 托管 bean:

    其中 appBean 代表类似: @ManagedBean(name="app") @ApplicationScoped class AppBean { @EJB private PersonService ps; private Converter personConverter; }

    CDI 风格 (JSR-299) 可能有更好的解决方案,但我 未能 让这个解决方案运行:

    cidBean 应该在哪里: @Named class CdiBean implements Converter { @EJB ... }

    失败并显示“调用默认行为,要求在构造函数中传递转换器 ID”

    无论如何,使用绑定和应用范围 JSF bean 的第一种方法有效

    【讨论】:

      【解决方案3】:

      JSF 2.0 和 CDI 的 Seam Faces 扩展允许在验证器和转换器中直接支持 @Inject。

      查看:http://ocpsoft.com/java/seam-faces-3-0-0-alpha2-jsf-2-0-just-got-even-easier/

      【讨论】:

        【解决方案4】:

        我不知道这个解决方案是否漂亮......但它确实有效:

        @ManagedBean
        public class AcquisitionConverter implements Converter
        {
            @EJB
            private AcquisitionService service;
        
            @Override
            public Object getAsObject(FacesContext context, UIComponent component, String value)
            {
                ...
            }
        
            @Override
            public String getAsString(FacesContext context, UIComponent component, Object value)
            {
                ...
            }
        }
        

        <h:inputText value="#{flowController.acquisition}" converter="#{acquisitionConverter}">
        

        使用 jsf 2.1.3 (mojarra) 和 glassfish 3.1.1

        【讨论】:

        • @FacesConverter 注释在这个结构中是多余的(而且只会让初学者感到困惑)。删除它。
        • 转换器="#{acquisitionConverter}" 对我来说不起作用
        • 我终于设法让它与转换器上的@Named @ApplicationScope 一起工作,诀窍是创建一个@FacesConfig(version = FacesConfig.Version.JSF_2_3) @ApplicationScoped ApplicationConfig 类,触发JSF 寻找CDI bean,否则它不起作用即使 faces-config.xml 有 version=2.3
        猜你喜欢
        • 2012-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-01
        相关资源
        最近更新 更多