【问题标题】:EJB3 injection into JSF managed beans failedEJB3 注入 JSF 托管 bean 失败
【发布时间】:2013-05-08 22:17:15
【问题描述】:

我正在使用 netbeans、glassfish3.1、EJB3 和 JSF2 开发一个 maven 企业应用程序。 我想将 DAOFacade EJB 注入 JSF 托管 bean,但它不起作用。 这是错误消息:

Caused by: javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=com.procc.beans.AlertController/ejbFacade,Remote 3.x interface =com.procc.dao.AlertFacade,ejb-link=null,lookup=,mappedName=,jndi-name=com.procc.dao.AlertFacade,refType=Session' .  Actual (possibly internal) Remote JNDI name used for lookup is 'com.procc.dao.AlertFacade#com.procc.dao.AlertFacade' [Root exception is javax.naming.NamingException: Lookup failed for 'com.procc.dao.AlertFacade#com.procc.dao.AlertFacade' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: com.procc.dao.AlertFacade#com.procc.dao.AlertFacade not found]]

DAOFacade 位于 EJB 模块中,JSF 托管 bean 位于 war 模块中。

+EAR-项目

--+EJB-模块

------AlertFacade.java

--+WAR-模块

------AlertController.java

我尝试将相同的 EJB 注入到一个 servlet 中,它运行良好,如下所示:

@WebServlet(name = "DAOServlet", urlPatterns = {"/DAOServlet"})
public class DAOServlet extends HttpServlet {

  @EJB
  private AlertFacadeLocal alertFacade;
  @EJB
  private AnomalyFacadeLocal anomalyFacade;

  protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
      List alertList = alertFacade.findAll();
      out.println("found "+alertList.size()+" alerts");
  }   
}    

这里是 JSF 托管 bean: @ManagedBean @ViewScoped 公共类 AlertController 扩展 AbstractController 实现 Serializable {

  @EJB
  private AlertFacade ejbFacade;

  public AlertController() {
      super(Alert.class);
  }

  @PostConstruct
  public void init() {
      super.setFacade(ejbFacade);
  }

}

这是 DAO 门面 EJB:

@Stateless
public class AlertFacade extends AbstractFacade<Alert> implements AlertFacadeLocal {
  @PersistenceContext(unitName = "flams_pu")
  private EntityManager em;

  @Override
  protected EntityManager getEntityManager() {
      return em;
  }

  public AlertFacade() {
      super(Alert.class);
  }    
}

我搜索了互联网,但我无法解决问题。 请帮忙。

是的,赖特!我忘记了控制器管理的bean。这里是:

@ManagedBean
@ViewScoped
public class AlertController extends AbstractController<Alert> implements Serializable {

@EJB
private AlertFacade ejbFacade;

public AlertController() {
    super(Alert.class);
}

@PostConstruct
public void init() {
    super.setFacade(ejbFacade);
}   

}

在 JSF 页面中:

<p:dataTable var="item" value="#{alertController.items}" paginator="true">

ejbFacade 注入 AlertController 会引发错误。

【问题讨论】:

  • 编写托管bean和会话bean的详细代码

标签: jsf-2 ejb-3.0 code-injection


【解决方案1】:

我遇到了类似的问题,但没能解决, 尽管有些博客声称这是可能的,但请参阅link。 我没有尝试过,但我想这只能在 Web 应用程序(战争包装)中而不是在企业应用程序(耳朵包装)中。

最后我决定使用 CDI 作为 bean 管理器和注入提供程序。 请参阅这些教程:

【讨论】:

    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2015-03-11
    • 2013-01-23
    • 2013-07-28
    • 2014-07-01
    • 2014-03-19
    相关资源
    最近更新 更多