如何在两个不同的 CDI bean 中使用相同的 EJB,并将从一个 bean 设置的值检索到另一个 bean 中



我有一个有状态的会话 bean,其中维护了一个列表:

@Stateful
public class CartDAO{
    private List<ShoppingCart> tempCart;
    public void add(ShoppingCart shoppingCart){
        tempCart.add(shoppingCart);
    }
    public List<ShoppingCart> getCart(){
        return tempCart;
    }
    @PostConstruct
    public void init(){
        tempCart = new ArrayList<>();
    }
}

要添加到购物车的控制器 1:

@Named
@SessionScoped
public class Controller1 implements Serializable {
        @EJB
        CartDAO cartDao;
        public String addToShoppingCart() {
        cartDao.add(shoppingCart);
        }
}

现在,我想问您是否可以从另一个购物车中将添加的项目添加到列表中?

 @Named
    @SessionScoped
    public class Controller2 implements Serializable {
            @EJB
            CartDAO cartDao;
            public String getShoppingCart() {
            System.out.println(cartDao.getCart());//returns null
            }
    }

显然,上面的代码返回 null。

如何从另一个控制器检索列表。任何帮助将不胜感激。

我在这里没有看到任何明显的错误(你确定在添加任何项目之前你没有调用Controller2#getShoppingCart()做你的CartDAO吗?)但这是我的几个想法

  • 你应该让你的CartDAO实现一些接口或使其@LocalBean
  • 所有有状态的 Bean 都应该有用 @Remove 注释的方法,以便您可以清理 Bean 中使用的资源(关闭数据源和儿子),并且在此调用后 Bean 将从内存中删除
  • 现在建议在任何地方使用@Inject而不是@EJB,都是一样的(只有在注入远程 bean 时才要使用 @EJB

还有一点,如果System.out.println(cartDao.getCart());返回 null,则意味着@PostConstruct没有被调用,这很奇怪。能否提供有关容器和环境的更多信息?还向我们展示进口,这是错误的大来源。

最新更新