У меня есть 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
.
Я обнаружил, что все это работает, если конечные точки синхронны. Может ли кто-нибудь помочь мне выяснить, в чем проблема и как заставить это работать с асинхронной конечной точкой.