Spring MVC中的HandlerInterceptor.afterCompletion()更改响应代码

sub*_*g26 16 spring jetty spring-mvc spring-boot

我正在使用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 );
}
Run Code Online (Sandbox Code Playgroud)

如果我在本地计算机上将其作为应用程序运行,此代码可以正常工作 但是当我们在jetty服务器上托管它时,UI会得到正确的错误响应(在我的情况下409),但在这种方法中,它会被记录为200.

[来自远程调试的图像显示status=200但是作为响应它409] 在此输入图像描述

有人可以帮助弄清楚为什么响应代码有变化?

我正在使用sprint 1.1.7.RELEASE spring boot version和jetty-distribution-9.2.10.v20150310.

Mas*_*ave 1

您需要确保在异常时调用对象setStatus上的方法response

如果您断言这一点,那么升级到 spring boot 版本 1.1.11 可以解决您的问题。它涉及此修复。在修复之前,在未在 .NET 上显式调用方法的ErrorPageFilter情况下,会屏蔽包装响应的响应状态。sendErrorErrorWrapperResponse

修复后的代码由简单变为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();
        }
Run Code Online (Sandbox Code Playgroud)

这就是为什么我相信升级将解决您的问题。

最后,如果你的问题持续存在,调试通过ErrorPageFilter应该指出问题的根源