1

我有一个有状态的会话 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<>();
    }
}

Controller1 添加到购物车:

@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。

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

4

1 回答 1

1

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

  • 你应该有你的CartDAO实现一些接口或制作它@LocalBean
  • 所有有状态的 bean 都应该有注解的方法,@Remove这样你就可以清理 bean 中使用的资源(关闭数据源和子),并且 bean 将在此调用后从内存中删除
  • 现在建议在@Inject所有地方使用而不是@EJB,它是一样的(@EJB只有在注入远程bean时才必须使用)

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

于 2013-10-02T12:05:32.483 回答