# response.sendError() von Bean aus



## freez (24. Apr 2008)

Hallo,

ich möchte aus einer Bean heraus auf eine Fehlerseite umleiten (beim Zugriff auf den Getter eines Property, wenn da ein Fehler bemerkt wird)


```
HttpServletresponse.sendError()
```

sollte das ja machen. Mit diesem Code habe ich meinen Versuch gestartet:


```
FacesContext facesContext = FacesContext.getCurrentInstance();

		HttpServletResponse resp = (HttpServletResponse)facesContext.getExternalContext().getResponse();
		try {
			System.out.println("Umleitung");
			resp.sendError(HttpServletResponse.SC_FOUND);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		facesContext.responseComplete();
```

Allerdings fliegt an der Stelle mit dem sendError() folgende Exception:

```
SCHWERWIEGEND: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException
	at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:421)
	at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:118)
	at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:118)
```

Was mache ich verkehrt?


----------



## maki (24. Apr 2008)

Solabld irgendetwas in den Response Body geschrieben wurde, darfst du keine Header mehr setzen.



> Was mache ich verkehrt?


Ich würde sagen dass du etwas grundsätzlich "un-JSF" machst.

actionListener: werte aus der View setzen, eben logik um daten aus den Views rauszuziehen, interne Status in der MBean setzen, etc.

action: internen status in der MBean prüfen und anhand dessen die nächste View aufrufen, also nur sagen welche view als nächstes kommt ohne große logik

IMHO komischer Fall, dass ein Fehler beim Zugriff auf den getter entdeckt wird.


----------



## freez (24. Apr 2008)

ok. konkretisiere ich mal:

in einem Getter hole ich mir Daten aus der Datenbank, und bestücke das Property mit den Daten aus der Bank . Nun kann es passieren, dass keine Daten kommen, weil die Ergebnissmenge leer ist. An der Stelle muß ich den User auf ne Fehlerseite umleiten, da sonst die Seite wieder angezeigt wird ohne richtigen Inhalt. Das ist ne Ausnahme, und da muss der User auf ne Fehlerseite geleitet werden (Eigentlich wäre es ja cool, wenn ich nur ne bestimmte Exception werfen müsste, und der Server leitet automatisch auf 404 um ).

Wenn ich das nicht in dem Getter machen darf ... wie oder wo mache ich das dann? Bin ja flexibel


----------



## HLX (24. Apr 2008)

Der Fehlercode 404 bedeutet URL nicht gefunden. Das ist ja wohl nicht das richtige.

Du solltest eine eigene Fehlerseite definieren - findet der Anwender bestimmt schöner als die üblichen HTTP-Fehlermeldungen. Die Seite kannst du dann in der web.xml mit Exceptions in Verbindung bringen:

```
<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/errorpage.jsp</location>
</error-page>
```

Im übrigen finde ich eine Exception bei einer leeren Ergebnismenge etwas hart.


----------



## freez (24. Apr 2008)

@HLX: Naja, der Hintergrund ist folgender: Der User könnte die JSF Seiten direkt aufrufen. Da in der Session wichtige Daten fehlen, kann die Seite nicht richtig angezeigt werden. Genauso sieht es aus, wenn die Session abläuft. Der User hat sein Browser noch ne Stunde offen, und klickt dann auf einen Link in der Anwendung. Dann sind alle Daten aus der Session weg und die Seite kann nicht richtig dargestellt werden.

Ich habe schon versucht diesen Fall auf ein paar wenige Fälle zu begrenzen(mit Session TimeOut 60Minuten und Cookies), aber diese Ausnahme (deutsch für "exception" ) möchte ich einfach behandeln.

Habe ich da vielleicht ein DesignFehler und könnte das Problem mit dem direkten Aufruf der Seiten und den abgelaufenen Sessions anders lösen? Auch die 60 Minuten Session TimeOut halte ich für viel. Was nimmt man da sinnvollerweise.


----------



## HLX (24. Apr 2008)

20 min. dürften reichen.

Da gibt es sicher geschicktere Wege als eine Exception beim Daten holen, da es wahrscheinlich ist, das dieser Zustand auch gewollt eintreten kann. 
Eine Möglichkeit den direkten Aufruf der JSP zu verhindern wäre ein entsprechendes URL-Pattern in der web.xml, dass auf ein Servlet umleitet. Eine andere Möglichkeit ist ein Servlet-Filter, der die Daten neu initialisiert, wenn die Session abgelaufen ist. Im zusammenhang mit JSF gibt´s sicher noch andere Lösungen. Bin da im Moment nicht auf dem aktuellen Stand.


----------



## freez (24. Apr 2008)

Thx HLX

Die Infos waren schon gut. Ich werde mal nen neuen Thread öffnen und nach Best Practise Methoden fragen.


----------

