2012-03-29 14 views
18

ich mit @ManagedProperty aber ohne Erfolg zu behandeln bin versucht!ManagedProperty in CDI @Named bean null zurück

Ich verfolge this Führung, und es scheint nicht so schwer. Aber mein Code wird einfach nicht funktionieren!

Hier ist ein kleiner Ausschnitt

@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(); 
} 

Dieser Code mir eine Nullpointer gibt, sagen, dass loginBean null ist!

Irgendwelche Vorschläge?

+0

Does @EJB Annotation automatisch die Bohne injizieren, oder wie Sie sie injizieren LoginBean? –

Antwort

36

Sie mischen JSF Bohnen mit CDI Bohnen verwaltet. Ihre LoginBean ist ein JSF Managed Bean (es hat die @ManagedBean Anmerkung). Ihr MessageBean ist eine CDI-Bean (es hat die @Named Annotation). Wenn Sie die Nachricht Bean zu einem JSF Managed Bean geändert (ersetzt @Named mit @ManagedBean), dann sollte das Problem gelöst werden (es sollte auch mit zwei CDI Bohnen arbeiten).

Hier ist ein kurzer Überblick darüber, wie zwischen den beiden Bohnenarten Injektion funktioniert:

CDI @Named -> CDI @Named (Werke)

CDI @Named -> JSF @ManagedBean (funktioniert nur wenn Umfang der injizierten Bohne breiter ist)

JSF @ManagedBean -> JSF @ManagedBean (funktioniert nur, wenn Umfang der injizierten Bohne ist breiter)

JSF @ManagedBean -> CDI @Named (wird nicht funktionieren)

Aber passen Sie auf die Scope-Importklassen auf. Je nach Bean-Typ gibt es verschiedene Klassen für @SessionScoped und @RequestScoped.

javax.faces.bean.SessionScoped für @ManagedBeans

javax.enterprise.context.SessionScoped für CDI @Named Bohnen

+0

Großartig, danke! Ich habe bereits versucht, '@ Named' durch' @ ManagedBean' zu ersetzen, aber ich hatte den falschen '@ RequestScoped' Annotationsimport, also hat es nicht funktioniert! – StepTNT

+0

Gut zu hören, dass es funktioniert. –

+0

Warum nicht in die andere Richtung gehen? CDI-verwaltete Beans bieten mehr Flexibilität und können alles, was Ihre JSF ManagedBeans können, tun. Siehe http://stackoverflow.com/questions/4347374/jsf-backing-beans-managedbean-or-cdi-beans-name – JanM