10

Ich versuche, ein DAO als verwaltete Eigenschaft zu injizieren.Der Zugriff auf die injizierte Abhängigkeit im Konstruktor der verwalteten Bean führt zu NullPointerException

public class UserInfoBean { 

    private User user; 

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

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

    // Getters and setters. 
} 

Das DAO Objekt injiziert wird, nachdem der bean erzeugt wird, aber es ist null im Konstruktor und daher NullPointerException verursacht. Wie kann ich die Managed Bean mithilfe der injizierten verwalteten Eigenschaft initialisieren?

Antwort

18

Die Einspritzung kann nur nach Konstruktion erfolgen, weil vor dem Bau gibt es keine geeignete Injektionsziel. Stellen Sie sich das folgende fiktive Beispiel vor:

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

Dies ist technisch einfach nicht möglich. In Wirklichkeit ist die folgende, was passiert:

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

Sie sollten eine Methode mit @PostConstruct kommentiert werden unter Verwendung von Aktionen nach dem Bau und Dependency Injection direkt ausführen (zB durch Frühjahr Bohnen, @ManagedProperty, @EJB, @Inject, usw.) .

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