在托管 bean 构造函数中访问注入的依赖项会导致 NullPointerException

Posted

技术标签:

【中文标题】在托管 bean 构造函数中访问注入的依赖项会导致 NullPointerException【英文标题】:Accessing injected dependency in managed bean constructor causes 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?

【问题讨论】:

【参考方案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");

【讨论】:

以上是关于在托管 bean 构造函数中访问注入的依赖项会导致 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

在JSF托管bean的构造函数中访问会话bean数据

Bean的注入

通过构造函数的依赖注入对EJB bean不起作用

Spring依赖注入构造器注入(通过构造函数注入)

为啥使用@PostConstruct?

spring 构造函数注入后怎么用