10

Próbuję wstawić obiekt DAO jako właściwość zarządzaną.Uzyskiwanie dostępu do wstrzykniętej zależności w zarządzanym konstruktorze komponentów bean powoduje wygenerowanie wyjątku NullPointerException.

public class UserInfoBean { 

    private User user; 

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

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

    // Getters and setters. 
} 

Przedmiotem DAO wtryskiwany po utworzeniu fasola, ale null w konstruktora, a tym samym powodując NullPointerException. Jak zainicjować zarządzany komponent bean za pomocą wstrzykiwanej właściwości zarządzanej?

Odpowiedz

18

Wtryskanie może odbywać się tylko po po po prostu dlatego, że przed rozpoczęciem budowy nie ma dopuszczalnego celu wtrysku. Wyobraźmy sobie następujący fikcyjny przykład:

UserInfoBean userInfoBean; 
UserDao userDao = new UserDao(); 
userInfoBean.setDao(userDao); // Injection takes place. 
userInfoBean = new UserInfoBean(); // Constructor invoked. 

Jest to technicznie po prostu niemożliwe. W rzeczywistości Oto co się dzieje:

UserInfoBean userInfoBean; 
UserDao userDao = new UserDao(); 
userInfoBean = new UserInfoBean(); // Constructor invoked. 
userInfoBean.setDao(userDao); // Injection takes place. 

należy używać metody opatrzone @PostConstruct do wykonywania czynności bezpośrednio po zakończeniu budowy i wstrzykiwania zależności (przez np fasoli wiosennej, @ManagedProperty, @EJB, @Inject, etc) .

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