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

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

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

应用程序范围的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
   @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
@ManagedBean(eager=true)
@适用范围
公共类Bean1实现了可序列化{
私有静态最终长serialVersionUID=12345L;
受保护的ArrayList应用程序;
//构造应用程序,使其可用于会话范围的bean
//做耗时的事情。。。
//接受者+接受者
会话作用域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
   @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
@ManagedBean
@会议范围
公共类Bean2实现了可序列化{
私有静态最终长serialVersionUID=123L;
@注入
私人Bean1 Bean1;
private ArrayList apps=bean1.getApps();//空指针异常

似乎正在发生的事情是,Bean1被创建,做了它的东西,然后在Bean2可以访问它之前被销毁。我希望使用应用程序作用域将保持Bean1在容器关闭或应用程序被杀死之前,但情况似乎不是这样。

您的第一行是正确的:

将在应用程序生命周期内存在的bean

但是,您无法访问构造函数中的注入资源,因为它可能还不可用。您的初始化行:
private ArrayList 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();
    }
}
@ManagedBean
@会议范围
公共类Bean2实现了可序列化{
私有静态最终长serialVersionUID=123L;
@注入
私人Bean1 Bean1;
私有ArrayList应用程序;
@施工后
私有void init(){
apps=bean1.getApps();
}
}