【问题标题】:Accessing injected dependency in managed bean constructor causes NullPointerException在托管 bean 构造函数中访问注入的依赖项会导致 NullPointerException
【发布时间】:2012-04-29 03:10:16
【问题描述】:

我正在尝试将 DAO 作为托管属性注入。

public class UserInfoBean {

    private User user;

    @ManagedProperty("#{userDAO}")
    private UserDAO dao;

    public UserInfoBean() {
        this.user = dao.getUserByEmail("test@gmail.com");
    }

    // Getters and setters.
}

DAO对象是在bean创建后注入的,但是在构造函数中是null,因此导致NullPointerException。如何使用注入的托管属性初始化托管 bean?

【问题讨论】:

    标签: jsf constructor nullpointerexception managed-bean managed-property


    【解决方案1】:

    注入只能发生在构建之后,因为在构建之前没有符合条件的注入目标。想象一下下面这个虚构的例子:

    UserInfoBean userInfoBean;
    UserDao userDao = new UserDao();
    userInfoBean.setDao(userDao); // Injection takes place.
    userInfoBean = new UserInfoBean(); // Constructor invoked.
    

    这在技术上根本不可能。实际情况如下:

    UserInfoBean userInfoBean;
    UserDao userDao = new UserDao();
    userInfoBean = new UserInfoBean(); // Constructor invoked.
    userInfoBean.setDao(userDao); // Injection takes place.
    

    您应该使用带有@PostConstruct 注释的方法在构造后直接执行操作 依赖注入(例如通过Spring bean、@ManagedProperty@EJB@Inject 等) .

    @PostConstruct
    public void init() {
        this.user = dao.getUserByEmail("test@gmail.com");
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2023-04-04
      • 1970-01-01
      • 2011-02-02
      • 2011-07-05
      • 1970-01-01
      • 2018-06-17
      相关资源
      最近更新 更多