Я использую 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}"))
}
}