scala - 使用 akka-http 记录响应正文时出现错误“Deflater 已关闭”
问题描述
我正在使用 Akka-Http 制作一个休息服务器,我想记录请求和结果,但是每当我尝试runReduce
在响应实体上执行时,我都会遇到异常。异常说java.lang.NullPointerException: Deflater has been closed
。该异常不会阻止我记录正文,但我只会在日志中出现乱码:��]D�O!�c�?�%{�GY\��>������t
。有人可以解释为什么会这样吗?我怀疑是因为存储响应体的流已关闭或未打开,但我不知道如何解决。
记录的设置如下所示。日志记录发生在logResponse
-method inside 中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}"))
}
}
解决方案
推荐阅读
- python - 在不更改现有图纸颜色的情况下更改新图纸的颜色
- windows - 通过powershell脚本执行docker run(Windows 10)
- python - 如何使用 `fsolve` 的初始值使用 `odeint` 求解 ODE?
- symfony - PDO 异常:驱动程序中发生异常:找不到 mysql 的驱动程序
- r - 用波斯语在 R 中进行文本挖掘
- react-native - 如何使用 Expo 将图像保存到相机胶卷?
- c# - 查找 DB 中位于 lat 和 long 半径内的所有点
- c - C中open()函数中的“权限被拒绝”
- reactjs - componentDidMount 有趣的问题
- java - kotlin 是否有一个返回迭代器的 map 函数?