Вопрос по nullpointerexception, constructor, managed-bean, jsf, managed-property – Доступ к внедренной зависимости в конструкторе управляемого компонента вызывает исключение NullPointerException

10

Я пытаюсь внедрить DAO как управляемое свойство.

<code>public class UserInfoBean {

    private User user;

    @ManagedProperty("#{userDAO}")
    private UserDAO dao;

    public UserInfoBean() {
        this.user = dao.getUserByEmail("[email protected]");
    }

    // Getters and setters.
}
</code>

Объект DAO внедряется после создания компонента, но этоnull в конструкторе и, следовательно, в результате чегоNullPointerException, Как я могу инициализировать управляемый компонент, используя введенное управляемое свойство?

Ваш Ответ

1   ответ
20

Инъекция возможна толькоafter строительство просто потому, что до строительства нет подходящей цели для инъекции. Представьте себе следующий вымышленный пример:

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 выполнять действия сразу после строительстваand внедрение зависимости (например, Spring beans,@ManagedProperty, @EJB, @Inject, так далее).

@PostConstruct
public void init() {
    this.user = dao.getUserByEmail("[email protected]");
}

Похожие вопросы