【发布时间】:2017-12-08 15:12:30
【问题描述】:
我为 spring 创建了一个过滤器(使用 spring boot v1.5),它在每个使用 OncePerRequestFilter 的请求上触发,如下所示:
@Component
class LogRequestFilter extends OncePerRequestFilter {
private static final Logger logger = LoggerFactory.getLogger(LogRequestFilter.class);
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException, ServletException {
ContentCachingRequestWrapper wrappedRequest = new ContentCachingRequestWrapper(request);
ContentCachingResponseWrapper wrappedResponse = new ContentCachingResponseWrapper(response);
int responseStatus = wrappedResponse.getStatusCode();
if (responseStatus == 500) {
String requestUri = wrappedRequest.getRequestURI();
byte[] responseBodyBytes = wrappedResponse.getContentAsByteArray();
logger.error("{}, {}, {}", responseStatus, requestUri, new String(responseBodyBytes));
}
filterChain.doFilter(wrappedRequest, response);
}
}
我的问题是发生错误时需要记录响应正文。但是,即使用户从 spring 收到以下响应,我也没有从 getContentAsByteArray() 获得数据:
{
"timestamp": 1512745726835,
"status": 500,
"error": "Internal Server Error",
"exception": "java.lang.NullPointerException",
"message": "No message available",
"path": "/documents/2017-02-17"
}
在调试时,我可以看到请求 URI 是正确的,但缺少响应正文。我该如何解决这个问题?
【问题讨论】:
-
他正在使用专为这种情况设计的 ContentCachingResponseWrapper。在没有文档的情况下使用它有点棘手。
-
@Gorazd 我同意,刚刚投了你一票,我想你可以为下一个人展示代码。
-
我发现我可以使用上面的代码访问所有导致 200 OK 的请求。只有 500 响应正文没有传递给过滤器。
-
我认为没有身体