Доступ к вложенной зависимости в управляемом конструкторе bean вызывает NullPointerException

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

public class UserInfoBean {

    private User user;

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

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

    // 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 beans, @ManagedProperty, @EJB, @Inject и т.д.).

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