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

时间:2012-04-17 18:34:44

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

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

public class UserInfoBean {

    private User user;

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

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

    // Getters and setters.
}

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

1 个答案:

答案 0 :(得分:21)

注射只能在构造之后进行,因为在施工之前没有合格的注射目标。想象一下以下虚构的例子:

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");
}