2016-04-03 11 views
1
のJsonWriterまたはJsonFormatタイプクラスが見つかりません

私はhttpリクエストを配置したクラスを持っています。これは私がjsonが必要な場所です。スプレーJson:

package com.webtrekk.cometd 
import com.webtrekk.json._ 
import spray.json._ 

import scala.concurrent.Future 
import scala.concurrent.duration._ 
import akka.util.Timeout 
import akka.pattern.ask 
import akka.io.IO 
import spray.can.Http 
import scala.util.{ Success, Failure } 

import akka.actor.ActorSystem 

import spray.http._ 
import HttpMethods._ 
import spray.http.HttpHeaders._ 
import spray.http.ContentTypes._ 
import spray.http.MediaTypes._ 


import scala.concurrent.Future 

class Handshake(var url:String, var token:String){ 
    val handshake = com.webtrekk.json.Handshake 
    implicit val system: ActorSystem = ActorSystem("salesforce") 
    implicit val timeout: Timeout = Timeout(15.seconds) 

    def execute() { 
    val contentType = new ContentType(MediaTypes.`application/json`, Option(HttpCharsets.`UTF-8`)) 

    val httpHeader = List(RawHeader("Authorization", "Bearer "+token)) 

    val httpEntity = HttpEntity(
     contentType, 
     handshake.toJson) 

    val responseFuture: Future[HttpResponse] = 
     (IO(Http) ? HttpRequest(
     method = POST, 
     uri = url, 
     entity = httpEntity, 
     headers = httpHeader)).mapTo[HttpResponse] 

    } 
} 

そして、ここでハンドシェイクJSONプロトコル

package com.webtrekk.json 
import spray.json._ 
import DefaultJsonProtocol._ 

class Handshake(
    val channel: String = "/meta/handshake", 
    val id: Int = 1, 
    val supportedConnectionTypes: Vector[String] = Vector("long-polling"), 
    val version: String = "1.0", 
    val minimumVersion: String = "1.0") { 
    var successful: Boolean = false 
    var clientId:String = "" 
} 

class HandshakeProtocol extends DefaultJsonProtocol { 
    implicit object HandshakeJsonFormat extends JsonFormat[Handshake] { 
    def write(h: Handshake): JsValue = 
     JsObject(
     "channel" -> JsString(h.channel), 
     "id" -> JsNumber(h.id), 
     "supportedConnectionTypes" -> JsArray(h.supportedConnectionTypes.map(value => JsString(value))), 
     "version" -> JsString(h.version), 
     "minimumVersion" -> JsString(h.minimumVersion) 
     ) 

    def read(value: JsValue): Handshake = 
     value.asJsObject.getFields(
     "channel", 
     "id", 
     "supportedConnectionTypes", 
     "version", 
     "minimumVersion", 
     "successful", 
     "cliendId" 
     ) match { 
      case Seq(
      JsString(channel), 
      JsNumber(id), 
      JsArray(supportedConnectionTypes), 
      JsString(version), 
      JsString(minimumVersion), 
      JsBoolean(successful), 
      JsString(clientId) 
      ) => { 
      var handshake = new Handshake(
       channel, 
       id.toInt, 
       supportedConnectionTypes.map(value => value.toString), 
       version, 
       minimumVersion) 

      handshake.successful = successful 
      handshake.clientId = clientId 
      handshake 
      } 
      case _ => throw new DeserializationException("JSON Error: Handshake Json Structure isn't correct!") 
     } 
    } 
} 

私もRootJsonFormatを拡張しました。しかし、これもうまくいきません。 なぜtoJsonメソッドが動作しないのかわかりません。私はスカラ座2.11.7

+1

あなたが書いた含意は、あなたが 'toJson'を呼んでいる範囲にはないでしょう。それらを直接インポートするか、 'Handshake'のコンパニオンオブジェクトに追加する必要があります。 – tryx

+0

オブジェクトに追加するとどういう意味ですか?拡張? –

+0

私はそれを持っています:暗黙のval handshakeFormat = HandshakeJsonFormatをハンドシェイククラスに追加しました。そして、私はHandshakeJsonFormatオブジェクトの外部クラスHandshakeProtocolを削除しました。 –

答えて

1

使用Handshake.this.handshake.type

ためJsonWriterまたはJsonFormat型クラスを見つけることができません私は握手クラスに

implicit val handshakeFormat = HandshakeJsonFormat 

を追加しました:実行時に私はエラーを取得します。これは機能します。これにより、HandhshakeJsonFormatはハンドシェイクの対象となります。ありがとうtryx

関連する問題