Доступ к внедренной зависимости в конструкторе управляемого компонента вызывает исключение 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");
}
Другие вопросы по тегам