2016-03-30 47 views
2

私はAkka HTTPを使い始めました。ルーティングDSLとマーシャリングには少し問題があります。私はかなりのドキュメントの例を踏襲してきましたAkka HTTPルーティングとマーシャリング

◾Cannot find JsonWriter or JsonFormat type class for scala.collection.immutable.Map[String,scala.collection.mutable.Map[String,Tweet]]

◾not enough arguments for method toJson: (implicit writer: spray.json.JsonWriter[scala.collection.immutable.Map[String,scala.collection> .mutable.Map[String,Tweet]]])spray.json.JsValue. Unspecified value parameter writer.

:また

value ~ is not a member of akka.http.scaladsl.server.RequestContext ⇒ scala.concurrent.Future[akka.http.scaladsl.server.RouteResult] possible cause: maybe a semicolon is missing before 'value ~'?

、エラーの原因となる「取得」節でJSONマーシャリング:エラーの「ルート」の設定結果にチルダ私はこれらのエラーを理解し、解決する方法を助けてくれてありがとうと思います。ありがとう。あなたの第一のエラーのために

API

import akka.actor.ActorSystem 
import scala.concurrent.Future 
import akka.stream.ActorMaterializer 
import akka.http.scaladsl.Http 
import akka.http.scaladsl.server.Directives.path 
import akka.http.scaladsl.server.Directives.pathPrefix 
import akka.http.scaladsl.server.Directives.post 
import akka.http.scaladsl.server.Directives.get 
import akka.http.scaladsl.server.Directives.complete 
import akka.http.scaladsl.unmarshalling.Unmarshal 
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._ 
import akka.http.scaladsl.server.Directives.{entity, as} 
import akka.http.scaladsl.model.StatusCodes.{Created, OK} 
import spray.json._ 
import DefaultJsonProtocol._ 
import akka.stream.Materializer 
import scala.concurrent.ExecutionContext 

trait RestApi { 
    import TweetProtocol._ 
    import TweetDb._ 

    implicit val system: ActorSystem 
    implicit val materializer: Materializer 
    implicit val execCtx: ExecutionContext 

    val route = 
    pathPrefix("tweets") { 
     (post & entity(as[Tweet])) { tweet => 
     complete { 
      Created -> Map("id" -> TweetDb.save(tweet)).toJson 
     } 
     } ~ 
     (get) { 
     complete { 
      OK -> Map("tweets" -> TweetDb.find()).toJson 
     } 
     } 
    } 
} 

object TweetApi extends App with RestApi { 
    implicit val system = ActorSystem("webapi") 
    implicit val materializer = ActorMaterializer() 
    implicit val execCtx = system.dispatcher 

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

    println(s"Server online at http://localhost:8080/\nPress RETURN to stop...") 
    Console.readLine() 

    bindingFuture.flatMap(_.unbind()).onComplete { _ => system.shutdown() } 
} 

プロトコル

import spray.json.DefaultJsonProtocol 

case class Tweet(author: String, body: String) 

object TweetProtocol extends DefaultJsonProtocol { 
    implicit val TweetFormat = jsonFormat2(Tweet.apply) 
} 

擬似データベース

import scala.collection.mutable.Map 

object TweetDb { 
    private var tweets = Map[String, Tweet]() 

    def save(tweet: Tweet) = { 
    val id: String = java.util.UUID.randomUUID().toString() 
    tweets += (id -> tweet) 
    id 
    } 

    def find() = tweets 

    def findById(id: String) = tweets.get(id) 
} 
+3

「ディレクティブ」からの個々のインポートではなく、「import akka.http.scaladsl.server.Directives._」をインポートすることで、1つの問題を修正できます。私は、あなたがすべてをインポートし、 '〜'演算子を有効にするときにインポートされるいくつかの意味を想像しています。 – cmbaxter

答えて

2

、suコマンドを試してみてくださいコメントからのggestion、すなわち。第二部のために、すべてのディレクティブ

からの輸入

◾Cannot find JsonWriter or JsonFormat type class for scala.collection.immutable.Map[String,scala.collection.mutable.Map[String,Tweet]]

◾not enough arguments for method toJson: (implicit writer: spray.json.JsonWriter[scala.collection.immutable.Map[String,scala.collection> .mutable.Map[String,Tweet]]])spray.json.JsValue. Unspecified value parameter writer.

あなたはRootJsonFormat などを拡張し、あなたのTweetProtocolでオブジェクトを作成することによりMap[String, mutable.Map[String, Tweet]]

ためJsonFormatを定義する必要があります。

type DBEntry = Map[String, mutable.Map[String, Tweet]] 
object TweetProtocol extends DefaultJsonProtocol { 
    implicit object DBEntryJsonFormat extends RootJsonFormat[DBEntry] { 
    override def read(json: JSValue) { 
     // your implementation 
    } 
    override def write(dbEntry: DBEntry) { 
     // implementation 
    } 
    } 
} 
+0

私は同じエラーがありました: "値〜はakka.http.scaladsl.server.Routeのメンバーではありません"。 – Readren

関連する問題