NullPointerException bei Outputwriter

J

JSFneuling

Gast
Hallo,

im Moment mache ich eine Anwendung mit JSF und verwende nur SessionScoped ManagedBeans. Eine Fehlermeldung soll nicht für die gesamte Session sondern nur für einen Request existieren:

Mein Ansatz: Ich versuche die Fehlermeldung in den Outputstream der Response zu schreiben.
Java:
errorMessage = "You have to be logged in to insert books";
       
        ResponseWriter out = FacesContext.getCurrentInstance().getResponseWriter(); // funktioniert
        try {
            out.write(errorMessage); // Die NullPointerException fliegt hier
        } catch (IOException ex) {
            Logger.getLogger(Books.class.getName()).log(Level.SEVERE, null, ex);
        }

Ich versteh nicht wo die NullPointer herkommt, da der Writer in Ordnung ist und die errorMessage nicht null.

Viele Grüße
 
Zuletzt bearbeitet von einem Moderator:
J

JSFneuling

Gast
Hallo,

ja ich bin mir sicher, weil die NullPointer meiner Meinung nach schon beim Zuweisen des ResponseWriter fliegen müsste wenn damit was nicht in Ordnung ist und die errorMessage ja hier
Java:
errorMessage = "You have to be logged in to insert books";
direkt drüber zu gewiesen wird.

Der Ort der NullPointer war aus dem StackTrace ersichtlich.

Nach einigem runprobieren bin ich auf folgenden funktionierenden Code gekommen:

Java:
errorMessage = "You have to be logged in to insert books";
       
        HttpServletResponse out = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
        try {
            out.getWriter().write(errorMessage);
        } catch (IOException ex) {
            Logger.getLogger(Books.class.getName()).log(Level.SEVERE, null, ex);
        }

Die Fehlermeldung wird wie gewollt ausgegeben, allerdings als erstes auf der Seite. Gibt es eine Möglichkeit zu kontrollieren wo der writer ausgegeben werden soll?

Warum funktioniert es so? Warum kann ich nicht den direkten ResponseWriter hernehmen? Was hat es mit dem ExternalContext auf sich?

Viele Grüße
 

Atze

Top Contributor
ein stacktrace, fehlermeldungen usw.

woher weißt du denn, dass eine nullpointer fliegt. und woher weißt du, dass es genau DA ist?
 
S

SlaterB

Gast
zu Teilfragen:
> ja ich bin mir sicher, weil die NullPointer meiner Meinung nach schon beim Zuweisen des ResponseWriter fliegen müsste

> FacesContext.getCurrentInstance().getResponseWriter();
kann null zurückgeben, dabei gibts doch kein Problem,
erst wenn dann auf dieses vermeinlichte Objekt, tatsächlich null, zugreifst, dann kommt die Exception


> Was ist ein trace?
die Liste der aufgerufenen Methoden hin zur Fehlerposition
etwa
Code:
java.io.FileNotFoundException: fred.txt
        at java.io.FileInputStream.<init>(FileInputStream.java)
        at java.io.FileInputStream.<init>(FileInputStream.java)
        at ExTest.readMyFile(ExTest.java:19)
        at ExTest.main(ExTest.java:7)
Java stack trace - How to print a stack trace to debug Java exceptions | devdaily.com
 
J

JSFneuling

Gast
Hallo,

danke an die Möglichkeit, dass null zurückgegeben werden kann hab ich nicht gedacht.
Die Abkrüzung trace für Stacktrace kannte ich nicht. In dem hab ich nachgeschaut und es ist angegeben in welcher Zeile meines Programms die NullPointer Exception fliegt.

Viele Grüße
 

Atze

Top Contributor
dann musst du an der stelle mit nem debugger durch und schauen ob out o.ä null ist, oder du prüfst vor dem zugriff auf null
 
J

JSFneuling

Gast
Hallo,

danke meine Variable out ist null. Damit ich selbst steuern kann wohin meine Fehlermeldung geschrieben wird habe ich folgendes probiert:

Java:
HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
        
              
        request.setAttribute("errorMessage", errorMessage);

Das Problem dabei ist, dass ich das gesetzte Attribut nicht über die EL erreichen kann. (Ein normales Attribut des ManagedBeans nehm ich nicht her, weil es sich dabei um SessionScope handelt, der für eine Fehlermeldung hinderlich ist)

Mein Versuch das Attribut auszulesen sieht so aus:

[XML]value="${facesContext.currentInstance.externalContext.request.getAttribute("errorMessage")}"[/XML]

Problem: bis request wird mir alles angeboten, das Attribute allerdings nicht mehr, da die Methode getRequest ein Object zurückliefert(siehe oben nötiger Typcast). Gibt es eine Möglichkeit das gesetzte Attribute mithilfe der EL auszulesen?

Viele Grüße
 
J

JSFneuling

Gast
Hallo,

die Lösung ist:

mittels der EL kann das Attribut mit:

${Attributname}

verwendet werden.

Viele Grüße

PS: Für mich ist das Problem damit gelöst. Danke für eure Hinweise
 

Ähnliche Java Themen

Neue Themen


Oben