我正在尝试将DAO注入(inject)为托管属性。

public class UserInfoBean {

    private User user;

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

    public UserInfoBean() {
        this.user = dao.getUserByEmail("[email protected]");
    }

    // Getters and setters.
}

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

最佳答案

注入(inject)只能在施工后进行,原因仅仅是在施工之前没有合格的注入(inject)目标。想象下面的虚拟示例:

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 注释的方法在构造和依赖项注入(inject)之后直接执行操作(例如,通过Spring bean,@ManagedProperty@EJB@Inject等)。
@PostConstruct
public void init() {
    this.user = dao.getUserByEmail("[email protected]");
}

10-08 19:41