【问题标题】:Spring boot actuator adding request body in trace throws HttpMessageNotReadableException在跟踪中添加请求主体的 Spring Boot 执行器会引发 HttpMessageNotReadableException
【发布时间】:2018-08-01 11:43:18
【问题描述】:

使用 Spring 启动执行器跟踪,我正在尝试使用请求和响应正文添加跟踪。我关注了How to include JSON response body in Spring Boot Actuator's Trace? 的帖子,并在不使用 logback 的情况下创建了一个 RequestTraceFilter 类。但是,如果我发出请求,则会在控制台中出现异常“无法读取 HTTP 消息:org.springframework.http.converter.HttpMessageNotReadableException:缺少所需的请求正文:”

另外,一旦我添加了这个过滤器,swagger-ui.html 就无法加载。

我在下面的课程中错过了什么吗?

@Component
public class RequestTraceFilter extends WebRequestTraceFilter {

private static final String RESPONSE_BODY = "resBody";
private static final String REQUEST_BODY = "reqBody";

public RequestTraceFilter(TraceRepository repository, TraceProperties properties) {
    super(repository, properties);
}

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
        throws ServletException, IOException {
    ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request);
    ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response);
    filterChain.doFilter(requestWrapper, responseWrapper);
    request.setAttribute(REQUEST_BODY, getRequestBody(requestWrapper));
    request.setAttribute(RESPONSE_BODY, getResponseBody(responseWrapper));
    super.doFilterInternal(requestWrapper, responseWrapper, filterChain);
}


private String getRequestBody(ContentCachingRequestWrapper request) {
    ContentCachingRequestWrapper wrapper = WebUtils.getNativeRequest(request, ContentCachingRequestWrapper.class);
    String characterEncoding = wrapper.getCharacterEncoding();
    return getPayload(wrapper.getContentAsByteArray(), characterEncoding);
}

@Override
protected Map<String, Object> getTrace(HttpServletRequest request) {
    Map<String, Object> trace = super.getTrace(request);
    Object requestBody = request.getAttribute(REQUEST_BODY);
    Object responseBody = request.getAttribute(RESPONSE_BODY);
    if(requestBody != null) {
        trace.put(REQUEST_BODY, (String) requestBody);
    }
    if(responseBody != null) {
        trace.put(RESPONSE_BODY, (String) responseBody);
    }
    return trace;
}

public String getPayload(byte[] buf, String characterEncoding) {
    String payload = null;
        if (buf.length > 0) {
            try {
                payload = new String(buf, 0, buf.length, characterEncoding);
            }
            catch (UnsupportedEncodingException ex) {
                payload = "[unknown]";
            }
        }
    return payload;
}

private String getResponseBody(ContentCachingResponseWrapper response) {
    ContentCachingResponseWrapper wrapper = WebUtils.getNativeResponse(response, ContentCachingResponseWrapper.class);
    return getPayload(wrapper.getContentAsByteArray(), wrapper.getCharacterEncoding());
}

}

【问题讨论】:

    标签: java spring spring-boot spring-boot-actuator


    【解决方案1】:

    使用responseWrapper.copyBodyToResponse();took from

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request);
        ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response);
        filterChain.doFilter(requestWrapper, responseWrapper);
        responseWrapper.copyBodyToResponse();
        request.setAttribute(REQUEST_BODY, getRequestBody(requestWrapper));
        request.setAttribute(RESPONSE_BODY, getResponseBody(responseWrapper));
        super.doFilterInternal(requestWrapper, responseWrapper, filterChain);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多