从View Scoped Managed Bean获取对已创建的`EJB的访问权限

时间:2014-08-30 18:33:35

标签: java-ee ejb jsf-2.2

在我的网站项目中,我有以下组件:

  1. EJB带注释的课程UserService
  2. EJB带注释的课程UserDAOImpl
  3. SessionScoped Managed Bean名为UserStateBean
  4. ViewScoped ManagedBean名为AdminDashboardView
  5. EJB UserService是使用initPostConstruct的{​​{1}}方法(使用UserStateBean注释)创建的同样是UserDAOImpl init方法创建的UserService方法。

    问题:

    1. 这些EJB类是无国籍的吗? (Haven没有使用它上面的任何注释,除了@EJB如果没有,它们应该是吗?
    2. AdminDashboardView,我需要访问UserService EJB。这样做的正确方法是什么?

    3. 我已经尝试过(2):
      AdminDashboardView,我宣布它是一个成员,像这样:

      @EJB
      private UserService userService;
      

      init函数中,我有:userService = new UserService(); 这很好用,并且成功完成了我想做的事情,但是,这是正确的做法吗?

      我对此的看法是,它可能是正确的,因为我得到的new UserService的{​​{1}}实例来自容器所拥有的池( source )。这是对的吗?

1 个答案:

答案 0 :(得分:3)

绝对不是!

您不应该自己创建EJB,因为您不应该自己创建JSF / CDI托管bean。您所拥有的是一个完全不受EJB容器控制的手动创建和托管实例。如果EJB类反过来包含@PersistenceContext或其他@EJB,那么它将保留null等。此外,手动创建的实例完全没有代理和事务管理的概念。 new的工作方式与main()方法完全相同。

@Stateless放在EJB类上,摆脱@PostConstruct中的手动创建。 @EJB基本上已经注入了它(就像@Inject基本上已经注入任何@Named一样。 @EJB支持注入@Stateless@Stateful@Singleton类。

另见: