在托管 bean 构造函数中访问注入的依赖项会导致 NullPointerException
Posted
技术标签:
【中文标题】在托管 bean 构造函数中访问注入的依赖项会导致 NullPointerException【英文标题】:Accessing injected dependency in managed bean constructor causes 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?
【问题讨论】:
【参考方案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");
【讨论】:
以上是关于在托管 bean 构造函数中访问注入的依赖项会导致 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章