RuntimeException приводит к 200 OK статусу - PullRequest
0 голосов
/ 03 октября 2019

Что у меня есть: экземпляр AEM 6.4. Если где-то в моем коде есть ошибка RuntimeExcepption, моя страница возвращает статус 200 OK. Чтобы решить эту проблему, я попытался сделать Filter.

@SlingFilter( order = Integer.MIN_VALUE, scope = SlingFilterScope.REQUEST)
public class RuntimeExceptionFilter implements javax.servlet.Filter {

    @Override
    public final void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) response;

        try {
            chain.doFilter(request, response);
        } catch (RuntimeException ex) {
            slingResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
    }
}

Теперь я могу отловить запрос, который приводит к RuntimeException, но slingResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

return me "java.lang.IllegalStateException:Ответ уже совершен ». Что может быть причиной этого? Или здесь могут быть другие способы заставить страницу вернуть 500 Status, если произошло RuntimeException?

Stacktrace:

Caused by: java.lang.IllegalStateException: Response has already been committed
    at org.apache.sling.engine.impl.SlingHttpServletResponseImpl.checkCommitted(SlingHttpServletResponseImpl.java:424) [org.apache.sling.engine:2.6.16]
    at org.apache.sling.engine.impl.SlingHttpServletResponseImpl.sendError(SlingHttpServletResponseImpl.java:170) [org.apache.sling.engine:2.6.16]
    at org.apache.sling.engine.impl.SlingHttpServletResponseImpl.sendError(SlingHttpServletResponseImpl.java:165) [org.apache.sling.engine:2.6.16]
    at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:127) [org.apache.felix.http.servlet-api:1.1.2]
    at my.project.RuntimeExceptionFilter.doFilter(RuntimeExceptionFilter.java:49)

1 Ответ

0 голосов
/ 03 октября 2019

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

Сначала попытайтесь определить, в какой момент именно HTTP-ответ возвращается. Как только вы обнаружите, что можете обойти это.

Я не очень знаком с внутренним AEM (имел очень мало практического опыта работы с ним), но, скорее всего, есть какая-то обертка (возможно, Aspect), которая в какой-то момент срабатывает и возвращает HTTP-ответ с 200.

...