10

Estoy tratando de inyectar un DAO como una propiedad administrada.El acceso a la dependencia inyectada en el constructor de beans administrados causa NullPointerException

public class UserInfoBean { 

    private User user; 

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

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

    // Getters and setters. 
} 

El objeto DAO se inyecta después de crear la haba, pero es null en el constructor y por lo tanto causando NullPointerException. ¿Cómo puedo inicializar el bean administrado usando la propiedad administrada inyectada?

Respuesta

18

La inyección solo puede tener lugar después de construcción simplemente porque antes de la construcción no hay un objetivo de inyección elegible. Imagine el siguiente ejemplo ficticio:

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

Esto no es técnicamente posible. En realidad, la siguiente es lo que está sucediendo:

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

Usted debe estar utilizando un método anotado con @PostConstruct para realizar acciones directamente después de la construcción y inyección de dependencias (por ejemplo, los granos de la primavera, @ManagedProperty, @EJB, @Inject, etc.) .

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