playframework 2.4 - Ошибка заголовков параметров с неопределенным значением

Я обновляю playframework 2.4 с 2.3, я изменил версии, и если я скомпилирую тот же код, я увижу следующую ошибку. Поскольку я новичок в 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;

    }
  }


}

Изменить

Я обновил коды следующим образом, и он хорошо скомпилирован

следующие коды изменены

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

to

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

person Chk0nDanger    schedule 20.10.2015    source источник


Ответы (1)


В нем просто говорится, что если вы хотите построить Headers, вам нужно предоставить поле с именем headers, которое имеет тип Seq[(String, String)]. Если вы опустите начальный new, вы будете использовать функцию apply соответствующего object для Headers, которая просто примет параметр vararg (String, String), и ваш код должен работать. Если вы посмотрите на документацию https://www.playframework.com/documentation/2.4.x/api/scala/index.html#play.api.mvc.Headers и пролистайте документацию для объекта и класса, чтобы все стало ясно.

person Markus    schedule 20.10.2015
comment
Спасибо за ответ, я обновил коды с вашей помощью, но совсем не уверен, хорошо это или нет. - person Chk0nDanger; 21.10.2015
comment
val newHeaders = Headers ( (AccessLogger.X_HEADER__REQUEST_ID -> requestId) ++ requestHeaders.headers.headers) должно быть достаточно. - person Markus; 25.10.2015