访问应用程序范围Bean会导致NullPointerException

时间:2013-11-03 02:24:02

标签: jsf

什么是应用程序范围Bean?我理解它是一个将在应用程序的生命周期中存在的bean,但这似乎不是正确的解释。我有一个应用程序,它在启动时创建一个应用程序范围的bean(eager = true),然后是一个尝试访问应用程序范围bean的对象(也是应用程序作用域)的会话bean。但是当我尝试从会话范围bean访问应用程序范围的bean时,我得到一个空指针异常。以下是我的代码摘录:

Application Scoped Bean:

    @ManagedBean(eager=true)
    @ApplicationScoped
    public class Bean1 implements Serializable{
      private static final long serialVersionUID = 12345L;
      protected ArrayList<App> apps;
      // construct apps so they are available for the session scoped bean
      // do time consuming stuff...
      // getters + setters

Session Scoped Bean:

   @ManagedBean
   @SessionScoped
   public class Bean2 implements Serializable{
     private static final long serialVersionUID = 123L;

     @Inject
     private Bean1 bean1;
     private ArrayList<App> apps = bean1.getApps();  // null pointer exception

似乎正在发生的事情是,Bean1被创建,它是什么东西,然后在Bean2可以访问它之前被销毁。我希望使用应用程序作用域将Bean1保持在周围,直到容器关闭,或者应用程序被杀死,但似乎并非如此。

1 个答案:

答案 0 :(得分:2)

你的第一行是正确的:

  

在应用程序的生命周期中存在的bean。

但是,您无法在构造函数中访问注入的资源,因为它可能尚不可用。您的初始化行:private ArrayList<App> apps = bean1.getApps();在对象构造期间运行。

相反,请在标有@PostConstruct注释的方法中访问资源:

@ManagedBean
@SessionScoped
public class Bean2 implements Serializable{
    private static final long serialVersionUID = 123L;

    @Inject
    private Bean1 bean1;
    private ArrayList<App> apps;


    @PostConstruct
    private void init() {
        apps = bean1.getApps();
    }
}