在我的网站项目中,我有以下组件:
EJB
带注释的课程UserService
EJB
带注释的课程UserDAOImpl
SessionScoped
Managed Bean
名为UserStateBean
ViewScoped
ManagedBean
名为AdminDashboardView
EJB
UserService
是使用init
和PostConstruct
的{{1}}方法(使用UserStateBean
注释)创建的同样是UserDAOImpl
init
方法创建的UserService
方法。
问题:
EJB
类是无国籍的吗? (Haven没有使用它上面的任何注释,除了@EJB
)如果没有,它们应该是吗? AdminDashboardView
,我需要访问UserService
EJB
。这样做的正确方法是什么? 我已经尝试过(2):
在AdminDashboardView
,我宣布它是一个成员,像这样:
@EJB
private UserService userService;
在init
函数中,我有:userService = new UserService();
这很好用,并且成功完成了我想做的事情,但是,这是正确的做法吗?
我对此的看法是,它可能是正确的,因为我得到的new
UserService
的{{1}}实例来自容器所拥有的池( source )。这是对的吗?
答案 0 :(得分:3)
绝对不是!
您不应该自己创建EJB,因为您不应该自己创建JSF / CDI托管bean。您所拥有的是一个完全不受EJB容器控制的手动创建和托管实例。如果EJB类反过来包含@PersistenceContext
或其他@EJB
,那么它将保留null
等。此外,手动创建的实例完全没有代理和事务管理的概念。 new
的工作方式与main()
方法完全相同。
将@Stateless
放在EJB类上,摆脱@PostConstruct
中的手动创建。 @EJB
基本上已经注入了它(就像@Inject
基本上已经注入任何@Named
一样。 @EJB
支持注入@Stateless
,@Stateful
和@Singleton
类。