【问题标题】:Accessing injected dependency in managed bean constructor causes NullPointerException在托管 bean 构造函数中访问注入的依赖项会导致 NullPointerException
【发布时间】:2012-04-29 03:10:16
【问题描述】:
我正在尝试将 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?
【问题讨论】:
标签:
jsf
constructor
nullpointerexception
managed-bean
managed-property
【解决方案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");
}