# ManagedBeans und Initialisierung



## McLane (12. Jul 2010)

Hallo zusammen,

ich bin gerade dabei mich in JSF einzuarbeiten. Hierzu habe ich das Buch "Java Server Faces - The Complete Reference" von Ed Burns gelesen. Es ist also reichlich theoretisches Wissen vorhanden.

Jedoch habe ich jetzt mit der Praxis so meine Probleme und hoffe, dass mir jemand dabei helfen kann:

Und zwar habe ich eine ManagedBean (LoginBacking), die eine andere ManagedBean (UserBean) aufrufen soll. Das ganze sieht so aus:

LoginBacking.java

```
...
UserBean ub = UserBean.getCurrentInstance();
...
```

UserBean.java

```
@ManagedBean(eager = true)
@ApplicationScoped
public class UserBean {
    public static UserBean getCurrentInstance() {
        UserBean result = null;

        Map<String, Object> appMap = FacesContext.getCurrentInstance().getExternalContext().getApplicationMap();

        result = (UserBean) appMap.get("userBean");

        return result;
    }

    ...
}
```

Die Idee habe ich aus dem o.g. Buch und sie sollte eigentlich das tun, was ich will. Jedoch kriegt LoginBacking immer null als UserBean. Eine NullPointerException wäre dann die Folge in den nächsten Zeilen bei LoginBacking. Bei verschiedenen Tests (Unter anderem viele LogMeldungen, Konstruktor und eine @PostConstruct-Methode geschrieben) habe ich festgestellt, dass keine UserBean erzeugt wird, obwohl das eager=true dieses sogar nach Applikationsstart durchführen sollte.

Da ich jetzt Momentan wenig neue Ideen habe, was man sonst noch ausprobieren könnte, hoffe ich, dass mich hier jemand auf den richtigen Weg führen kann.

Danke


----------



## gman (12. Jul 2010)

Hi,

soweit sieht das ja alles richtig aus und du hast ja schon so einiges ausprobiert. Liegt es vielleicht
eher an der Laufzeit-Umgebung? Welchen App-Server nimmst du denn?


----------



## McLane (12. Jul 2010)

Danke für die Antwort.

Das ganze läuft bei mir auf einem Glassfish V3 mit Java 1.6 auf einem Mac. Mittlerweile habe ich das ganze auch schon auf zwei verschiedenen Rechnern ausprobiert, jedoch immer wieder mit der NullPointerException.

Das Problem liegt an Zeile 9 meines Codes, da für den Key "userRegistry" kein passender Value vorhanden ist. Um das zu bestätigen habe ich mal alle Keys der ApplicationMap ausgeben lassen. Das ist auch kein Wunder, da der Konstruktor der UserBean komischer Weise nie aufgerufen wird.

Ich habe auch schon ein wenig gegoogled und scheine der einzige zu sein, der das Problem hat.

Zur Not gäbe es noch andere Lösungen. Zum Beispiel könnte man das UserBean-Objekt manuell erzeugen oder die UserBean als Stateless Bean verwenden, aber das ist ja eigentlich nicht der Sinn der Sache. Deshalb wäre ich froh, wenn ich das mit einer ManagedBean zum Laufen kriegen würde.


----------



## gman (12. Jul 2010)

Hi,

ich habe das mal in Netbeans 6.9 mit dem mitgelieferten Glassfish nachgestellt. Leider kann ich den Fehler nicht
reproduzieren  Ich kann die Erzeugung der UserBean auch mit dem "eager"-Attribut steuern, setze ich es auf
"false" wird keine UserBean erzeugt.

Welchen Scope hat denn deine LoginBacking eigentlich?

Edit: Hmm, scheint keine Rolle zu spielen. Worüber ich kurz gestolpert bin: Importierst du die
Annotationen aus dem richtigen Package? Ich hatte die erst aus dem Package "javax.enterprise"
importiert :autsch:


----------



## McLane (12. Jul 2010)

Hallo gman,

ich habe das Problem mittlerweile lösen können. Und zwar habe ich die UserBean von einer Oberklasse AbstractEntityAccessor abgeleitet (Habe ich hier der Einfachheit halber weggelassen). An diese habe ich die Annotationen ManagedBean und RequestScoped gesetzt. Seit ich diese beiden Annotationen gelöscht habe läuft es ohne Probleme.

Ich meine auch irgendwo gelesen zu haben, dass beim RequestScope das eager-Attribut ignoriert wird.

Diese Dummheit meinerseits hat mich ca 6 Stunden meines Lebens gekostet. Immerhin läuft es jetzt.

Nochmals Danke für deine Hilfe


----------

