Акка http маршрут с scala будущее - PullRequest
0 голосов
/ 21 февраля 2020

Вот ситуация

// validateRoute act like a directive which validate a route before proceeding further
override def validateRoute(route: Route)(implicit ec: ExecutionContext): Route = {
  extractRequest { request =>
    decodeRequest {
      entity(as[String]) { content =>
        (headerValueByName("header1") & headerValueByName("header2")) {
          case (header1, header2) => {
            // dom some
            // validate() returns a Future[Either[Error, Boolean]]
            validate().map {
              result => {
                result match {
                  case Right(_) => route
                  case Left(ex) => complete(StatusCodes.Unauthorized -> ex.getMessage)
                }
              }
            }
          } // I get a error here saying It expect route whereas it is Future[Route]
        }
      }
    }
  }
}

Я получаю вышеупомянутую ошибку, также я не могу изменить тип возвращаемого значения validate (), есть ли способ исправить эту проблему. Мне нужен способ вернуть маршрут вместо Future [Route]

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Если вы зарегистрировали директиву handleRejections, вы можете использовать директиву onSuccess для Future:

onSuccess(validate()) {
  case Right(_) => route
  case Left(ex) => complete(StatusCodes.Unauthorized -> ex.getMessage)
}

В противном случае вы можете использовать директиву onComplete, и вам придется совпадение Success и Failure

0 голосов
/ 21 февраля 2020

Если вы ДОЛЖНЫ возвращать маршрут вместо Future [Route], вы можете попробовать использовать

Await.result(validate(), Duration(2, TimeUnit.SECONDS)) //substitute your choice of duration

, это будет блокировать до подтверждения возврата.

Таким образом, полное решение будет выглядеть так:

// validateRoute act like a directive which validate a route before proceeding further
override def validateRoute(route: Route)(implicit ec: ExecutionContext): Route = {
  extractRequest { request =>
    decodeRequest {
      entity(as[String]) { content =>
        (headerValueByName("header1") & headerValueByName("header2")) {
          case (header1, header2) => {
            // dom some
            // validate() returns a Future[Either[Error, Boolean]]
            Await.result(validate(),Duration(2, TimeUnit.SECONDS) ) match 
                {
                  case Right(_) => route
                  case Left(ex) => complete(StatusCodes.Unauthorized -> ex.getMessage)
                }
          }  
        }
      }
    }
  }
}
...