Не получается тело ответа при использовании ContentCachingResponseWrapper - PullRequest
1 голос
/ 21 апреля 2020

У меня есть Springboot API в Scala с несколькими конечными точками. Все конечные точки имеют асин c и возвращают DeferredResult. Я хочу использовать фильтры для записи тела ответа в некоторых случаях. Я создал фильтр с порядком 1 для кэширования запросов и ответов, как показано ниже:

@Component
@Order(1)
class ContentCachingFilter extends OncePerRequestFilter {
  override def doFilterInternal(request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain): Unit = {
    val requestToCache  = new ContentCachingRequestWrapper(request)
    val responseToCache = new ContentCachingResponseWrapper(response)
    filterChain.doFilter(requestToCache, responseToCache)
    responseToCache.copyBodyToResponse()
  }
}

Мой фильтр ведения журнала аналогичен приведенному ниже (удаленный домен указан c logi c):

@Component
@Order(2)
class RequestResponseLoggingFilter extends OncePerRequestFilter {

  override def doFilterInternal(request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain): Unit = {

    logger.info(
      s"Request -> URL : ${request.getMethod} ${request.getRequestURI} ${request.getParameterMap.asScala.stringRepresentation()}")
    logger.debug(
      s"Request Headers -> Content-type : ${request.getContentType} \\n Headers : ${new ServletServerHttpRequest(request).getHeaders}")

    filterChain.doFilter(request, response)

    logger.info(s"Response -> Status : ${response.getStatus}")

  }
}

Мне нужно использовать ContentCachingResponseWrapper, потому что я хочу записать тело ответа. Однако, даже не пытаясь зарегистрировать тело ответа и просто введя ContentCachingResponseWrapper, я не получаю никакого ответа на вызовы к любой конечной точке. Локальный работающий экземпляр возвращает вывод в виде curl:

HTTP/1.1 200
Content-Type: application/json
Content-Length: 197
.
.
.
<
* transfer closed with 197 bytes remaining to read
* stopped the pause stream!
* Closing connection 0
curl: (18) transfer closed with 197 bytes remaining to read

Если я удаляю ContentCachingFilter, приведенный выше фильтр ведения журнала работает нормально, но если я пытаюсь зарегистрировать тело ответа, поток ответа расходуется, а ответ больше не генерируется. Следовательно, мне нужно использовать ContentCachingFilter.

Я обнаружил, что все это работает, если конечные точки синхронны. Может ли кто-нибудь помочь мне выяснить, в чем проблема и как заставить это работать с асинхронной конечной точкой.

...