【问题标题】:playframework 2.4 - Unspecified value parameter headers errorplayframework 2.4 - 未指定值参数标头错误
【发布时间】:2015-10-20 12:49:01
【问题描述】:

我正在从 2.3 升级 playframework 2.4,我更改了版本,然后如果我编译相同的代码,我会看到以下错误。由于我是 Scala 的新手,我正在尝试学习 Scala 来解决这个问题,但仍然不知道问题出在哪里。我想要做的是从原始请求标头中添加一个请求标头值。任何帮助将不胜感激。

[error] /mnt/garner/project/app-service/app/com/company/playframework/filters/LoggingFilter.scala:26: not enough arguments for constructor Headers: (headers: Seq[(String, String)])play.api.mvc.Headers.
[error] Unspecified value parameter headers.
[error]     val newHeaders = new Headers { val data = (requestHeader.headers.toMap

LoggingFilter 类

class LoggingFilter extends Filter {

  val logger = AccessLogger.getInstance();

  def apply(next: (RequestHeader) => Future[Result])(requestHeader: RequestHeader): Future[Result] = {

    val startTime = System.currentTimeMillis

    val requestId = logger.createLog();

    val newHeaders = new Headers { val data = (requestHeader.headers.toMap
      + (AccessLogger.X_HEADER__REQUEST_ID -> Seq(requestId))).toList }
    val newRequestHeader = requestHeader.copy(headers = newHeaders)
    next(newRequestHeader).map { result =>
      val endTime = System.currentTimeMillis
      val requestTime = endTime - startTime

      val bytesToString: Enumeratee[ Array[Byte], String ] = Enumeratee.map[Array[Byte]]{ bytes => new String(bytes) }
      val consume: Iteratee[String,String] = Iteratee.consume[String]()
      val resultBody : Future[String] = result.body |>>> bytesToString &>> consume

      resultBody.map {
        body =>
          logger.finish(requestId, result.header.status, requestTime, body)
      }
      result;

    }
  }


}

编辑

我更新代码如下,编译良好​​p>

以下代码已更改

    val newHeaders = new Headers { val data = (requestHeader.headers.toMap
      + (AccessLogger.X_HEADER__REQUEST_ID -> Seq(requestId))).toList }

    val newHeaders = new Headers((requestHeader.headers.toSimpleMap
      + (AccessLogger.X_HEADER__REQUEST_ID -> requestId)).toList)

【问题讨论】:

    标签: scala playframework playframework-2.4


    【解决方案1】:

    它只是说明如果你想构造Headers,你需要提供一个名为headers的字段,它的类型是Seq[(String, String)]。如果您省略了初始的new,您将使用对应objectapply 函数作为Headers,它只需要一个可变参数(String, String) 并且您的代码应该可以工作。如果您查看文档 https://www.playframework.com/documentation/2.4.x/api/scala/index.html#play.api.mvc.Headers 并在对象和类的文档之间切换,它应该会变得清晰。

    【讨论】:

    • 感谢您的回答,我在您的帮助下更新了代码,但不确定它是否好。
    • val newHeaders = Headers ( (AccessLogger.X_HEADER__REQUEST_ID -> requestId) ++ requestHeaders.headers.headers) 应该足够了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2019-04-06
    • 2018-07-30
    相关资源
    最近更新 更多