2017-07-28 14 views
1

私はAkka HTTP(Scalaで)を使用してRESTサービスを行っています。私は、ZonedDateTime型に変換するためにhttp get要求に渡されるパラメータが必要です。 StringまたはIntを使用しようとするとZonedDateTime型で失敗するとコードはうまく動作します。コードはそのようになります。ここではScala Akka java.time.ZonedDateTimeとしてのHTTPキャストパラメータ

parameters('testparam.as[ZonedDateTime]) 

は私が見ているエラーです:

Error:(23, 35) type mismatch; 
found : akka.http.scaladsl.common.NameReceptacle[java.time.ZonedDateTime] 
required: akka.http.scaladsl.server.directives.ParameterDirectives.ParamMagnet 
      parameters('testparam.as[ZonedDateTime]){ 

私はリストに複数のパラメータを追加した場合、私は別のエラーを取得:

Error:(23, 21) too many arguments for method parameters: (pdm: akka.http.scaladsl.server.directives.ParameterDirectives.ParamMagnet)pdm.Out 
      parameters('testparam.as[ZonedDateTime], 'testp2){ 

http://doc.akka.io/japi/akka-stream-and-http-experimental/2.0/akka/http/scaladsl/server/directives/ParameterDirectives.htmlの問題を調査していて、import akka.http.scaladsl.server.directives.ParameterDirectives.ParamMagnetを追加しても、Scala 2.11を使用しても問題を解決できませんでしたが、問題が解決しませんでした。

誰かが私が間違っていることと、なぜZonedDateTimeタイプが機能しないのか説明してもらえますか?前もって感謝します!ここで

は私がZonedDateTimeとして

import java.time.ZonedDateTime 

import akka.actor.ActorSystem 
import akka.http.scaladsl.Http 
import akka.http.scaladsl.model._ 
import akka.http.scaladsl.server.Directives._ 
import akka.stream.ActorMaterializer 

import scala.io.StdIn 


object WebServer { 
    def main(args: Array[String]) { 

    implicit val system = ActorSystem("my-system") 
    implicit val materializer = ActorMaterializer() 
    // needed for the future flatMap/onComplete in the end 
    implicit val executionContext = system.dispatcher 

    val route = 
     path("hello") { 
     get { 
      parameters('testparam.as[ZonedDateTime]){ 
      (testparam) => 
       complete(testparam.toString) 
      } 
     } 
     } 

    val bindingFuture = Http().bindAndHandle(route, "localhost", 8080) 

    println(s"Server online at http://localhost:8080/\nPress RETURN to stop...") 
    StdIn.readLine() // let it run until user presses return 
    bindingFuture 
     .flatMap(_.unbind()) // trigger unbinding from the port 
     .onComplete(_ => system.terminate()) // and shutdown when done 
    } 
} 

答えて

4

を見ている問題を再現する必要があるコードスニペットでネイティブにアッカ-HTTPによって非整列化されていない、あなたはparametersディレクティブにカスタムアンマーシャラーを提供する必要があります。

この機能については、文書hereで簡単に説明しています。

アンマーシャラーは、Unmarshaller.strictを使用して関数から作成できます。

val stringToZonedDateTime = Unmarshaller.strict[String, ZonedDateTime](ZonedDateTime.parse) 

この例では、パラメータがISO形式で提供されていることを前提としています。そうでない場合は、アンマーシャル関数を修正する必要があります。

あなたはその後、パラメータディレクティブに渡すアンマーシャラーを使用することができます。

parameters("testparam".as(stringToZonedDateTime)){ 
      (testparam) => 
       complete(testparam.toString) 
      } 
関連する問題