HandlerInterceptor.afterCompletion() в spring MVC изменяет код ответа

Я использую spring структуру MVC. Я хочу регистрировать статусы ошибок всякий раз, когда генерируется исключение, поэтому метод afterCompletion используется в HanlderInterceptor.

@Override
public void afterCompletion( final HttpServletRequest request, final HttpServletResponse response, final Object handler, final Exception ex)
{
    final int responseCode = response.getStatus();
    s_logger_error.error("status code: " + responseCode );
}

Этот код отлично работает, если я запускаю его как приложение на локальном компьютере. Но когда мы размещаем его на сервере причалов, UI получает правильный ответ об ошибке (в моем случае 409), но в этом методе он регистрируется как 200.

[Изображение из удаленного отладки, где он показывает status=200, но в ответ это 409] enter image description here

Может кто-нибудь помочь выяснить, почему в коде ответа есть изменения?

Я использую sprint 1.1.7.RELEASE spring загрузочную версию и причал-распределение-9.2.10.v20150310.

Ответы

Ответ 1

Вам нужно убедиться, что вы вызываете метод setStatus объекта response при исключении.

Если вы это подтвердите, то при обновлении до версии spring версия для загрузки 1.1.11 может исправить вашу проблему. Это относится к fix. До исправления, ErrorPageFilter маскировал статус ответа завернутого ответа в случаях, когда метод sendError явно не вызван в ErrorWrapperResponse.

Код после фиксированного изменен от простого return this.status до

        if (this.errorToSend) {
            return this.status;
        }
        else {
            // If there was no error we need to trust the wrapped response
            return super.getStatus();
        }

поэтому я считаю, что обновление решит вашу проблему.

Наконец, если вы решите проблему, отладка через ErrorPageFilter должна указывать на происхождение проблемы