Скрыть / обработать вывод трассировки стека исключений сервлета - PullRequest
2 голосов
/ 19 января 2011

Начиная с этой записи. Я подумал о другом вопросе, на который, похоже, не могу найти ответ в Интернете.

У меня есть фильтр сервлетов, который определяет тайм-ауты сеанса и перенаправляет на страницу с ошибкой. Из-за моего молодого Java, я использовал блоки try try для отлова исключений и изящной их обработки, но в ситуации тайм-аута сеанса контекст недопустим, поэтому я не думаю, что у меня есть какой-либо код, с помощью которого можно остановите трассировку 'viewId не может быть восстановлен', даже если у меня есть фильтр, обрабатывающий его.

Как я могу остановить появление трассировки исключений в моем журнале? Он будет автоматически отслеживаться в прямом эфире, и это будет ложный положительный вызов в службу поддержки для такого рода ошибки.

Любая помощь приветствуется.

EDIT

Чтобы быть более понятным, мой кодовый клип в настоящее время

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;
        }
    }
}

В журнале написано:

    |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.

Как вы можете видеть из кода, я поймал исключение сервлета в фильтре, но стек все еще появляется в журнале.

СЛЕДУЮЩАЯ РЕДАКТИРОВКА Полный список фильтров в моем web.xml выглядит следующим образом:

<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>

Ответы [ 3 ]

4 голосов
/ 19 января 2011

Фильтры выполняются в порядке, определенном в файле web.xml.В вашем случае, похоже, что фильтр jfaces выполняется первым и регистрирует трассировку стека, прежде чем ваш пользовательский фильтр сможет его отфильтровать.Попробуйте сделать запись фильтра в web.xml первой.

РЕДАКТИРОВАТЬ

Возможно, что какой-то другой фильтр в цепочке регистрирует ServletException, прежде чем он выбрасываетЭто.В трассировке стека, которую вы опубликовали, похоже, что есть фильтр для ajax4jsf, который может регистрировать ServletException.У вас есть источник для этого?Как фильтры могут быть в вашем web.xml?

РЕДАКТИРОВАТЬ 2

Похоже, ajax4jsf ловит ServletException и регистрирует сообщение об ошибке, прежде чем выбросить его обратно.Я предлагаю вам получить исходный код для используемой версии ajax4jsf, посмотреть строки трассировки стека (BaseXMLFilter.java строка 178 и BaseFilter.java строка 290) и выполнить поиск операторов логирования.Если вы найдете их, вы можете либо удалить их из исходного кода и перестроить ajax4jsf, либо отключить категорию в файле конфигурации журналирования.Я не рекомендую последнее, потому что вы пропустите другие ошибки, которые могут возникнуть в фильтре.

Если это не источник сообщения об ошибке, то, боюсь, у меня закончились идеи.

1 голос
/ 19 января 2011

Возможно, потому что вы выбросили исключение, что бы оно ни записывало, оно все равно получает его.Даже если вы блокируете ServletException и повторно выбрасываете RunTimeException (что и является ViewExpiredException), что-то более высокое в цепочке фильтров может перематывать его.лог до трассировки стека?

0 голосов
/ 19 января 2011

Вы сами пытались написать фильтр сеансов? Найдите хороший пример здесь .

...