12

我正在尝试将 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?

4

1 回答 1

23

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

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");
}
于 2012-04-17T18:39:43.147 回答