2017-01-30 6 views
3

私は自分のカスタムディレクティブを作成するために、既存のakka http(バージョン10)ディレクティブをネストしようとしています。試合から返されるタイプがDirective0あるakka httpカスタムネストされたディレクティブ

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

が、私はタイプDirective0の

Expressionが期待に準拠していないIDEA

からこのエラーを取得する:私はこのようなもので問題を抱えていますコンパイラからのルート

と、このエラーを入力し

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をネストして適用しています。実際には、最終的な入れ子レベルはRoute(SBTの苦情によるRequestContext ⇒ Future[RouteResult]のエイリアス)です。あなたが何をしたいか

に他のDirective SにDirective Sを変換し、あなたが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

関連する問題