Доступ к внедренной зависимости в конструкторе управляемого компонента вызывает исключение NullPointerException
Я пытаюсь внедрить 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 внедряется после создания компонента, но это null
в конструкторе и, следовательно, в результате чего NullPointerException
, Как я могу инициализировать управляемый компонент, используя введенное управляемое свойство?
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 beans, @ManagedProperty
, @EJB
, @Inject
, так далее).
@PostConstruct
public void init() {
this.user = dao.getUserByEmail("test@gmail.com");
}