2017-01-30 10 views
3

Я пытаюсь вложить существующие директивы akka http (версия 10) для создания моих собственных пользовательских директив. У меня возникли проблемы с вещами, как это:akka http custom вложенные директивы

def echoHeaderDirective: Directive0 = optionalHeaderValueByName("X-Echo-Header") { 
    case Some(value) => respondWithHeader(RawHeader("X-Echo-Header", value)) 
    case _ => pass 
} 

типа возвращается из матча Directive0, но я получаю эту ошибку от IDEA

Выражение типа Directive0 не соответствует ожидается тип маршрута

и эту ошибку компилятора

type mismatch; 
[error] found : akka.http.scaladsl.server.Directive0 
[error]  (which expands to) akka.http.scaladsl.server.Directive[Unit] 
[error] required: akka.http.scaladsl.server.RequestContext => scala.concurrent.Future[akka.http.scaladsl.server.RouteResult] 
[error]  case Some(value) => respondWithHeader(RawHeader("X-Echo-Header", value)) 

Можно ли создавать пользовательские директивы в этом стиле (вложенность), и если да, то что я делаю неправильно?

ответ

4

Что вы делаете, это по существу применение Directive s путем их вложения, как вы это сделали бы, чтобы сформировать ваш Route. И действительно, окончательный уровень гнездования ожидает Route (который является псевдонимом для RequestContext ⇒ Future[RouteResult], согласно жалобе SBT).

То, что вы хотите сделать, это преобразованиеDirective сек в другие Directive с, и сделать это, вы должны использовать map/flatMap функции. Пример ниже:

def echoHeaderDirective: Directive0 = optionalHeaderValueByName("X-Echo-Header") flatMap { 
    case Some(value) => respondWithHeader(RawHeader("X-Echo-Header", value)) 
    case _ => pass 
    } 

Дополнительная информация here.

+0

ах прекрасный спасибо. по какой-то причине я прочитал эту страницу раньше и как-то полностью пропустил flatMap – kag0