2013-10-02 26 views
1

我有状态会话Bean其中保存的名单:如何在两个不同的CDI bean中使用相同的EJB,并将从一个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。

如何从其他控制器检索列表。任何帮助都感激不尽。

+0

你真的*表示null,还是你的意思是列表是空的,因为Controller1和Controller2每个都有一个唯一的CartDAO实例? –

回答

1

我看不出这里有什么明显的错误(你确定你不添加任何项目之前做打电话Controller2#getShoppingCart()CartDAO?),但这里有几个我观念

  • 你应该有你的CartDAO实现一些接口或使其@LocalBean
  • 所有状态的bean应该有注解的方法与@Remove这样你就可以清理在bean使用的资源(接近数据源和儿子)和豆将从这个内存调用之后被去除
  • 现在它建议使用@Inject无处不在,而不是@EJB,这是相同的(你必须使用@EJB只有当你注入远程豆)

而且也有一点,如果System.out.println(cartDao.getCart());返回空值比它意味着@PostConstruct避风港不被称为奇怪的。你能提供一些关于集装箱和你的环境的更多信息吗?同时向我们展示进口产品,这是错误的重要原因。

+1

使用@Inject注解解决 – Nishant

相关问题