2012-03-29 21 views
18

Tôi đang cố xử lý @ManagedProperty nhưng không thành công!ManagedProperty trong CDI @Named bean trả về null

Tôi đã theo dõi this hướng dẫn và dường như không khó. Nhưng mã của tôi chỉ đơn giản là không hoạt động!

Dưới đây là một chút đoạn

@ManagedBean 
@SessionScoped 
public class LoginBean { 

@EJB 
private LoginUserLocal loginUser; 
private boolean loggedIn = false; 
private User user; 
private StreamedContent image; 
. 
. 
. 
//-- 
@Named(value = "messagesBean") 
@RequestScoped 
public class MessagesBean { 

@ManagedProperty(value = "#{loginBean}") 
private LoginBean loginBean; 

public LoginBean getLoginBean() { 
    return loginBean; 
} 

public void setLoginBean(LoginBean loginBean) { 
    this.loginBean = loginBean; 
} 

public String getUser() { 
    System.err.println(loginBean == null); 
    return loginBean.getUser().getUsername(); 
} 

Mã này mang lại cho tôi một NullPointerException, nói rằng loginBean là null!

Bất kỳ đề xuất nào?

+0

Liệu @EJB chú thích tự động tiêm đậu, hoặc làm thế nào để bạn tiêm họ LoginBean? –

Trả lời

36

Bạn đang trộn các hạt được JSF quản lý với các hạt CDI. LoginBean là một bean được JSF quản lý (có chú thích @ManagedBean). MessageBean là một đĩa CDI (có chú thích @Named). Nếu bạn đã thay đổi bean Message thành một bean được quản lý JSF (thay thế @Named với @ManagedBean) thì vấn đề sẽ được giải quyết (Nó cũng làm việc với hai bean CDI).

Dưới đây là một tổng quan ngắn về cách tiêm làm việc giữa hai loại đậu:

CDI @Named -> CDI @Named (hoạt động)

CDI @Named -> JSF @ManagedBean (chỉ hoạt động nếu phạm vi của đậu tiêm là rộng hơn)

JSF @ManagedBean -> JSF @ManagedBean (chỉ hoạt động nếu phạm vi của đậu tiêm là rộng hơn)

JSF @ManagedBean -> CDI @Named (sẽ không hoạt động)

Nhưng hãy quan tâm đến các lớp nhập phạm vi. Có các lớp khác nhau cho @SessionScoped@RequestScoped tùy thuộc vào loại đậu.

javax.faces.bean.SessionScoped cho @ManagedBeans

javax.enterprise.context.SessionScoped cho CDI @Named đậu

+0

Tuyệt vời, cảm ơn! Tôi đã thử thay thế '@ Named' bằng' @ ManagedBean', nhưng tôi đã nhập sai chú thích '@ RequestScoped', vì vậy nó không hoạt động! – StepTNT

+0

Rất vui khi biết rằng nó hoạt động. –

+0

Tại sao không đi theo cách khác arround? Các bean được quản lý CDI cung cấp sự linh hoạt hơn và có thể làm mọi thứ mà JSF ManagedBeans của bạn có thể làm được. Xem http://stackoverflow.com/questions/4347374/jsf-backing-beans-managedbean-or-cdi-beans-named – JanM