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