在管理bean的构造函数访问注入的依赖会导致空指针异常在管理bean的构造函数访问注入的依赖会导致空

2019-05-13 13:51发布

我试图注入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对象被注入,但它是null的构造函数,因此导致NullPointerException 。 我怎么能初始化利用喷射的托管属性的托管Bean?

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


文章来源: Accessing injected dependency in managed bean constructor causes NullPointerException