Spray Json: не удается найти класс типа JsonWriter или JsonFormat для

У меня есть класс, в котором я разместил http-запрос. Это то место, где мне нужен 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 не работает. При выполнении я получаю сообщение об ошибке: не удается найти класс типа JsonWriter или JsonFormat для Handshake.this.handshake.type

Я использую Скала 2.11.7


person Citrullin    schedule 03.04.2016    source источник
comment
Имплициты, которые вы написали, не будут находиться в области, в которой вы вызываете toJson. Вам нужно либо импортировать их напрямую, либо добавить к сопутствующему объекту Handshake.   -  person tryx    schedule 03.04.2016
comment
Что вы имеете в виду под добавлением к объекту? Расширение?   -  person Citrullin    schedule 03.04.2016
comment
Хорошо: у меня есть: добавлен неявный val handshakeFormat = HandshakeJsonFormat в класс рукопожатия. И я удалил внешний класс HandshakeProtocol объекта HandshakeJsonFormat.   -  person Citrullin    schedule 04.04.2016


Ответы (1)


я добавил

 implicit val handshakeFormat = HandshakeJsonFormat 

на урок рукопожатия. Это работает. При этом HandhshakeJsonFormat находится в области рукопожатия. Благодаря tryx

person Citrullin    schedule 02.05.2016