我正在尝试将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?
答案 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");
}