我有一个有状态会话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。
如何从其他控制器检索列表。任何帮助将不胜感激。
答案 0 :(得分:1)
我在这里没有看到任何明显的错误(你确定在添加任何项目Controller2#getShoppingCart()
之前没有打电话给CartDAO
吗?)但这里有几个我的想法
CartDAO
实现某个界面或将其设为@LocalBean
@Remove
注释的方法,这样你就可以清理bean中使用的资源(关闭数据源和子),并且在调用之后将从内存中删除bean @Inject
而不是@EJB
,它是相同的(只有在注入远程bean时才必须使用@EJB
)还有一点,如果System.out.println(cartDao.getCart());
返回null,则意味着@PostConstruct
没有被调用,这很奇怪。你能提供一些关于容器和环境的更多信息吗?同时向我们展示进口,这是错误的重要来源。