使用JEE6将EJB注入JSF转换器

时间:2010-01-07 10:12:30

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

我有一个无状态的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();
  }

4 个答案:

答案 0 :(得分:6)

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

  

[...]允许容器注入引用   容器在将资源托管到JSF应用程序之前将其托管到托管bean实例中。   只有 bean 声明在请求中,   会话或应用范围   资源注入。

但到目前为止,据我所知,JNDI查找应该可以解决问题。

答案 1 :(得分:2)

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

< f:converter binding =“#{app.personConverter}”/>

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

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

< f:converter binding =“#{cdiBean}”/>

cidBean应该是: @Named class CdiBean implements Converter { @EJB ... }

因为要求在构造函数

中传递转换器ID而调用的默认行为失败

无论如何首先使用绑定和应用范围的JSF bean 工作

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

我不知道这个解决方案是否相当......但确实有效:

@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