Ошибка "Deflater был закрыт" при регистрации тела ответа с помощью akka-http - PullRequest
0 голосов
/ 18 января 2019

Я использую Akka-Http, чтобы создать сервер отдыха, и я хочу регистрировать запросы и результаты, однако я получаю исключение всякий раз, когда пытаюсь сделать runReduce для объекта ответа. Исключение говорит java.lang.NullPointerException: Deflater has been closed. Исключение не мешает мне регистрировать тело, но в журнале я получаю только тарабарщину: ��]D�O!�c�?�%{�GY\��>������t. Может кто-нибудь объяснить, почему это происходит? Я подозреваю, потому что поток, в котором хранится тело ответа, закрыт или не открыт, но я не знаю, как его решить.

Настройка для регистрации показана ниже. Регистрация происходит в logResponse -методе внутри RequestResponseLogWriter. Я использую собственные директивы akkas для получения сущностей запроса и ответа. Ведение журнала осуществляется с помощью slf4j.

trait RouteBuilder extends Directives {

  val logWriter = new RequestResponseLogWriter()

  val routes: Route =
    extractRequestContext { context =>
      logRequestResult(LoggingMagnet(_ => logWriter.responseLogging(context))) {
        ComponentRegistry.searchRestApi.routes
      }
    }
}


class RequestResponseLogWriter extends LazyLogging {
  val responseLogging = (context: RequestContext) => (request: HttpRequest) =>
                        (result: RouteResult) =>
    result match {
      case RouteResult.Complete(response) => logResponse(context, request, response)
      case RouteResult.Rejected(_) =>
    }

  private def logResponse(context: RequestContext, request: HttpRequest, 
                          response: HttpResponse): Unit = {
    implicit val ec: ExecutionContext = context.executionContext
    implicit val mat: Materializer = context.materializer
    response.entity.dataBytes.runReduce(_ ++ _)
      .foreach(bytes => logger.info(s"Body ${bytes.utf8String}"))
  }
}
...