フィルタをPlay 2.5.xで使用する方法が見つかりませんでした。 私のアプリケーションがステータスコード400-500を返した場合、リクエストと結果を記録する "BadRequestLogFilter"を作成したいScala Play 2.5.0 2.5.1結果本体へのアクセスによるフィルタリング
Play 2.4.xでは、Iterateesを使用しました。 このコードをPlay 2.5.xに移行することができませんでした。誰かが私にここでヒントを与えることができますか?たぶん、フィルターでボディを取得するための穴のアプローチは悪い考えですか?ここで
は(正常に動作し2.4.xの中に)私の古いが、私はちょうどここに、このラインのための有効な交換が必要と推測プレイ2.4.xの
class BadRequestLogFilter @Inject() (implicit val mat: Materializer, ec: ExecutionContext) extends Filter {
val logger = Logger("bad_status").underlyingLogger
override def apply(next: (RequestHeader) => Future[Result])(request: RequestHeader): Future[Result] = {
val resultFuture = next(request)
resultFuture.foreach(result => {
val status = result.header.status
if (status < 200 || status >= 400) {
val c = Try(request.tags(Router.Tags.RouteController))
val a = Try(request.tags(Router.Tags.RouteActionMethod))
val body = result.body.run(Iteratee.fold(Array.empty[Byte]) { (memo, nextChunk) => memo ++ nextChunk })
val futResponse = body.map(bytes => new String(bytes))
futResponse.map { response =>
val m = Map("method" -> request.method,
"uri" -> request.uri,
"status" -> status,
"response" -> response,
"request" -> request,
"controller" -> c.getOrElse("empty"),
"actionMethod" -> a.getOrElse("empty"))
val msg = m.map { case (k, v) => s"$k=$v" }.mkString(", ")
logger.info(appendEntries(m), msg)
}
}
})
resultFuture
}
}
ためのフィルタである:
val body = result.body.run(Iteratee.fold(Array.empty[Byte]) { (memo, nextChunk) => memo ++ nextChunk })