2016-06-26 17 views
0

私は、ネストされたケースクラスでエラーが発生するケースクラス用のjsonProtocolを書こうとしていました。一方、私がケースクラスをデカップリングし、すべてのフィールドを持つ1つの巨大なケースクラスを作成すると、うまく動作します。私のルートが私のプロトコルを認識しないのはなぜですか?

case class Invited(invited:Array[Int]) 
case class Event(eventName:String,eventID:Int,invited: Invited) 

object jsonProtocol extends DefaultJsonProtocol { 
    implicit val invitedFormat = jsonFormat(Invited,"people Invited") 
    implicit val eventFormat = jsonFormat3(Event) 
} 

object WebServer { 

    def main(args:Array[String]): Unit ={ 

    implicit val system = ActorSystem() 
    implicit val materializer = ActorMaterializer() 
    implicit val dispatcher = system.dispatcher 
    //println(Event("HelloEvent",2,Array(1,2,3)).toString) 
    val route = { 
     import jsonProtocol._ 
     path("Event") { 
     post{ 
      entity(as[Event]) {event => 
      println(event.eventName) 
       complete(event) 
      } 
     } 
     } 
    } 

    val bindingFuture = Http().bindAndHandle(route,"localhost",8080) 
    StdIn.readLine() // let it run until user presses return 
    bindingFuture 
     .flatMap(_.unbind()) // trigger unbinding from the port 
     .onComplete(_ => system.terminate()) // and shutdown when done 

    } 
} 

complete(event)とのラインは私が期待ToResponseMarshallable、実際のイベントを言ってエラーが発生します。

+0

あなたは 'jsonFormat(Invited、" people invited ")の代わりに' jsonFormat1(Invited) 'を使ってみましたか? – devkat

+0

はい私は持っています。それは私が見たものから2つの間で違いはありません。 –

答えて

3

akka httpでスプレーjsonを使用している間にマーシャリングエラーを修正するには、SprayJsonSupportjsonProtocolオブジェクトに混ぜる必要があります。

だから、単にインポートを追加します。

import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport 

と変更ライン:

object jsonProtocol extends DefaultJsonProtocol { 

に:

object jsonProtocol extends DefaultJsonProtocol with SprayJsonSupport { 

PS scalastyleによると、あなたは^[A-Z][A-Za-z]*でオブジェクトに名前を付け、そうすべきです最初の文字は大文字であるべきですjsonProtocol

関連する問題