无法实例化ManagedBean

时间:2013-01-04 14:51:42

标签: jsf jsf-2

当我的网络应用程序从我的ProductsBean到达构造函数时崩溃了。

我收到此错误:Can't instantiate class: beans.ProductsBean

这是我的ProductsBean

@ManagedBean
@ViewScoped
public class ProductsBean implements Serializable {

    private List<ProductBean> products;

    @ManagedProperty(value = "#{applicationBean}")
    private ApplicationBean applicationBean;

    private ProductBean selectedProduct;


    public ProductsBean() {
        Store store = applicationBean.getStore();

        for (String c : store.getCategories()) {
            for (Product p : store.getProductsOfCategory(c)) {
                products.add(new ProductBean(p.getProduct_id(), p.getDescription(), p.getPrice(), p.getCategoryName()));
            }
        }

此错误的原因是什么?

1 个答案:

答案 0 :(得分:3)

applicationBean在构造函数中为null。

在处理托管bean时,尽可能使构造函数保持愚蠢(并且不要在那里使用托管属性)。逻辑涉及那些应该在@PostConstruct方法中,框架将在托管属性更新后执行它。

@PostConstruct
private void init(){
  Store store = applicationBean.getStore();

  for (String c : store.getCategories()) {
    for (Product p : store.getProductsOfCategory(c)) {
      products.add(new ProductBean(p.getProduct_id(), p.getDescription(), p.getPrice(), p.getCategoryName()));
    }
  }
}

此外,您需要托管属性的设置器

public void setApplicationBean(ApplicationBean applicationBean) {
  this.applicationBean = applicationBean;
}