Verstecken/verarbeiten servlet-Ausnahme-stack-trace-Ausgabe
Vom diese post habe ich gedacht eine andere Frage, die ich kann nicht scheinen, um herauszufinden, die Antwort auf die interweb.
Ich habe einen servlet-filter, der erkennt, session timeouts und leitet auf eine Fehlerseite. Aufgrund meines noch Jungen java habe ich schon benutzt, try catch-Blöcke zum abfangen von Ausnahmen und behandeln Sie Sie vorsichtig, aber in einem session-timeout-situation, der Kontext ungültig ist, so glaube ich nicht, ich habe alle Codes die ich kann tun mit denen aufhören, die "viewId konnte nicht wiederhergestellt werden' stace trace erscheint in meinem log, obwohl ich einen filter handling.
Wie kann ich verhindern, dass die Ausnahme-trace erscheint in meinem log? Es wird überwacht, autoamtically im Leben, und es wird eine false-positive-rufen Sie das support-team für diese Art von Fehler.
Jede Hilfe dankbar.
BEARBEITEN
Mehr klar, mein code-clip ist derzeit
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try {
chain.doFilter(request, response);
} catch (ServletException e) {
logger.error("Caught Servlet Exception");
Throwable rootCause = e.getRootCause();
logger.error("Root cause is " + rootCause.toString());
if (rootCause instanceof RuntimeException) { //This is true for any FacesException.
logger.error("Rethrowing exception as RuntimeException" + rootCause.toString());
throw (RuntimeException) rootCause; //Throw wrapped RuntimeException instead of ServletException.
} else {
throw e;
}
}
}
Sagt der log:
|STDOUT| 2011-01-19 10:40:57,803 | ERROR | [http-8080-5]: Exception in the filter chain
javax.servlet.ServletException: viewId:/index.jsf - View /index.jsf could not be restored.
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:270)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
<snip>
at java.lang.Thread.run(Unknown Source)
Caused by: javax.faces.application.ViewExpiredException: viewId:/index.jsf - View /index.jsf could not be restored.
<snip>
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
... 21 more
19-Jan-2011 10:40:57 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
javax.faces.application.ViewExpiredException: viewId:/index.jsf - View /index.jsf could not be restored.
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:185)
<snip>
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
|STDOUT| 2011-01-19 10:40:57,803 | ERROR | [http-8080-5]: Caught Servlet Exception
|STDOUT| 2011-01-19 10:40:57,803 | ERROR | [http-8080-5]: Root cause is javax.faces.application.ViewExpiredException: viewId:/index.jsf - View /index.jsf could not be restored.
|STDOUT| 2011-01-19 10:40:57,803 | ERROR | [http-8080-5]: Rethrowing exception as RuntimeExceptionjavax.faces.application.ViewExpiredException: viewId:/index.jsf - View /index.jsf could not be restored.
Als Sie aus dem code sehen können, habe ich gefangen die servlet-Ausnahme in den filter, aber der stack ist immer noch erscheinen im Protokoll.
WEITER BEARBEITEN
Die komplette Liste der Filter, in meinem web.xml ist wie folgt:
<filter>
<filter-name>Error</filter-name>
<filter-class>prismClient.ErrorFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Error</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<display-name>RichFaces Filter</display-name>
<filter-name>richfaces</filter-name>
<filter-class>org.ajax4jsf.Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>richfaces</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
Du musst angemeldet sein, um einen Kommentar abzugeben.
Filter werden in der Reihenfolge ausgeführt, definiert sind Sie in der
web.xml
- Datei. In Ihrem Fall sieht es so aus das jfaces filter zuerst ausgeführt und die Protokollierung der stack-trace, bevor Sie Ihre benutzerdefinierten filter hat eine chance, um es zu filtern aus. Versuchen Sie, Ihre filter-Eintrag inweb.xml
die erste.BEARBEITEN
Es ist möglich, dass einige andere filter in der Kette ist die Protokollierung der
ServletException
bevor er wirft es. In der stack-trace, das Sie geschrieben, es sieht aus wie es ist ein filter fürajax4jsf
werden kann Protokollierung derServletException
. Hast du die Quelle für diese? Wie kann die Filter sind in Ihrerweb.xml
?EDIT 2
Sieht es aus wie ajax4jsf ist ansteckend
ServletException
- und logging eine Fehlermeldung, bevor Sie werfen es wieder heraus. Ich schlage vor, dass du die Quelle für die version von ajax4jsf, die Sie verwenden und betrachten Sie die Linien in dem stack-trace (BaseXMLFilter.java
Linie 178 undBaseFilter.java
Zeile 290) und Suche für die Protokollierung von Aussagen. Wenn Sie Sie finden, können Sie entweder entfernen Sie Sie aus der Quelle und den Wiederaufbau ajax4jsf, oder deaktivieren Sie die Kategorie in Ihrer logging-Konfigurationsdatei. Ich weiß nicht empfehlen letztere, weil Sie übersehen andere Fehler, die auftreten können, im filter.Wenn das nicht die Quelle der Fehlermeldung, dann ich fürchte, ich habe die Ideen ausgehen.
filter
undfilter-mapping
) vor der RichFaces Filter und ich bekomme immer noch ein stacktrace in das Protokoll, wenn die Sitzung timesout. Ich verwende Log4J wirklich in einer standard-Weg.Vielleicht, weil Sie rethrow die Ausnahme, was bei der Anmeldung ist es immer noch bekommen. Auch wenn Sie die Blockierung der ServletException aus-und erneutes auslösen von der RunTimeException (die ViewExpiredException ist), etwas höher in der filter-Kette kann rewrapping es.
Haben die logs, die Sie schreiben in dieser Methode zeigen sich auch im Protokoll vor der stacktrace?
Haben Sie versucht, das schreiben eines Session-filter selbst? Finden Sie ein schönes Beispiel hier.