JSF ExternalContext usw.

Willi2793

Aktives Mitglied
Hi,

diesmal habe ich ein Problem bei dem ich wohl den Wald vor lauter Bäumen nicht sehe. Und zwar möchte ich in einer RequestScoped ManagedBean Varialen vorbelegen. Und zwar diese:

Java:
    private FacesContext facesContext;
    private Map<String, Object> requestMap;
    private Map<String, Object> sessionMap;

Das versuche ich zum einem auf die Art wie es Ed Burns in seinem Buch "The complete Reference Javaserver Faces 2.0" erklärt:

Java:
    @ManagedProperty(value="#{facesContext}")
    private FacesContext facesContext;

    @ManagedProperty(value="#{requestScope}")
    private Map<String, Object> requestMap;

    @ManagedProperty(value="#{sessionScope}")
    private Map<String, Object> sessionMap;

und auch auf diese Weise:

Java:
    @PostConstruct
    public void init() {
        facesContext = FacesContext.getCurrentInstance();
        requestMap = facesContext.getExternalContext().getRequestMap();
        sessionMap = facesContext.getExternalContext().getSessionMap();
    }

Beides führt aber dazu das beim Aufruf in einem Facelet von:

[XML] <c:if test="#{loginBacking.userLoggedIn}">
ABBCDEF
</c:if>[/XML]

zwar diese Methode:

Java:
    public boolean isUserLoggedIn() {
        System.out.println("FacesContext");
        System.out.println(facesContext);
        System.out.println("RequestMap");
        System.out.println(requestMap);
        System.out.println("SessionMap");
        System.out.println(sessionMap);
        return getSessionMap().containsKey("currentUser");
    }

aufgerufen wird aber immer ist der Inhalt der Variablen "null" (wie ausgegeben wird) und ich erhalte deshalb eine NPE. Wie kann ich diese Variablen korrekt initialisieren?

Grüße,
Willi
 

Fant

Bekanntes Mitglied
Ich kann gerade keinen Fehler sehen.
Wird die init-Methode korrekt aufgerufen? Einfach mal ein sysout dazwischen packen. Am besten auch direkt in den Konstruktor. Und vielleicht die Aufrufe innerhalb der init-Methode mal testweise in den Konstruktor der Bean packen.
Wenn du das hast, dann meld dich mal mit den Ergebnissen wieder und dann schauen wir weiter.
 
Zuletzt bearbeitet:

Willi2793

Aktives Mitglied
Hm, im Moment bin ich etwas ratlos. Ich habe nur Copy&Paste aus dem PostCinstructor in den normalen Constructor gemacht, getestet und dann das Ganze wieder zurück. Ergebnis: Beides funktionierte. Nur die Injection nicht. Kann das überhaupt so funktionieren?
 

F.S.WhiTeY

Bekanntes Mitglied
Just one more thing to worry about:
Once you hand off your request to the FacesServlet, if you try to do any work in a PhaseListener before the RESTORE_VIEW phase (in the beforePhase() method) you will again experience the null ViewRoot issue, but this time, you cannot set a new UIViewRoot object, so you must wait until the afterPhase() method is called to do your work. ViewRoot will have been initialized by the JSF application at that point.


JSF 2.0 Extension Development: Accessing FacesContext in a Filter | OCPsoft

google: JSF 2.0 FacesContext lifecycle
 

Willi2793

Aktives Mitglied
Ich arbeite mit NetBeans und habe beim Erstellen des Projektes angekreuzt das ich CDI haben möchte. Das hat auch den Import für RequestScoped von einem anderen Package geholt. Nun habe ich dasselbe Projekt nochmal ohne das Kreuz erstellt und schon funktioniert auch die Injection wie oben angegeben.

Danke und grüße,
Willi
 

Neue Themen


Oben