10

Tôi đang cố gắng tiêm một DAO như một thuộc tính được quản lý.Việc truy cập phụ thuộc được tiêm vào trong hàm tạo bean được quản lý gây ra NullPointerException

public class UserInfoBean { 

    private User user; 

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

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

    // Getters and setters. 
} 

Đối tượng DAO được tiêm sau khi đậu được tạo ra, nhưng nó là null trong các nhà xây dựng và do đó gây NullPointerException. Làm thế nào tôi có thể khởi tạo bean được quản lý bằng cách sử dụng thuộc tính được quản lý được tiêm?

Trả lời

18

Tiêm chỉ có thể diễn ra sau khi xây dựng đơn giản chỉ vì trước khi xây dựng không có mục tiêu tiêm đủ điều kiện. Hãy tưởng tượng ví dụ giả tưởng sau:

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

Đây không phải là điều đơn giản về mặt kỹ thuật. Trên thực tế sau đây là những gì đang xảy ra:

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

Bạn nên sử dụng một phương pháp chú thích với @PostConstruct để thực hiện các hành động trực tiếp sau khi xây dựng và dependency injection (bằng cách ví dụ như đậu mùa xuân, @ManagedProperty, @EJB, @Inject, vv) .

@PostConstruct 
public void init() { 
    this.user = dao.getUserByEmail("[email protected]"); 
} 
Các vấn đề liên quan