在上下文中获取@EJB

Getting @EJB in the context

如此处所讨论的那样 要获取有状态会话 Bean 的相同实例,我必须将其保存在相关的 HttpSession 中。它运行良好,但在 servlet 中我这样做了:

SessionCart cart = (SessionCart) request.getSession().getAttribute("cart");
if (cart==null){
   cart = new SessionCart();}

属性 "cart" 是我保存初始化购物车的地方。问题是,如果之前未初始化购物车,则行 cart=new SessionCart();初始化一个与Context无关的bean,所以@PercistenceContext得到的entitymanager为null。我尝试使用注释

@EJB
private SessionCart cart;

但是这个无论如何都会创建一个新的会话购物车,不受我的控制(所以如果我有一个与用户相关的购物车,我会创建一个新的并丢弃它......这不是很好)。我的问题是:我可以创建一个新的有状态会话 Bean 而不使用注释 @EJB 并使其与上下文相关吗?所以我可以控制何时创建它

如果我没记错的话,你想懒惰地初始化你的bean。

要在运行时 control/create 您的 bean,您可以使用 Instance<Bean> Java EE API

在你的情况下它看起来像这样:

@Inject
private Instance<SessionCart> sessionCartInstance;

if (cart == null) {
    cart = sessionCartInstance.get();
}