Маршаллер не найден

Просто попробовал спрей-json, и, похоже, у него возникли проблемы с поиском моих JsonProtocols, которые я настроил. У меня есть следующие зависимости:

"io.spray"                %   "spray-servlet" % "1.2-M8",
"io.spray"                %   "spray-routing" % "1.2-M8",
"io.spray"                %   "spray-testkit" % "1.2-M8",
"io.spray"                %   "spray-json_2.10" % "1.2.5"

И следующий код:

Content.scala

import spray.json.DefaultJsonProtocol

case class Content(id:String, name: String, contentType: String, duration: Int)

object MyJsonProtocol extends DefaultJsonProtocol {
    implicit val contentFormat = jsonFormat4(Content)
}

Я получаю сообщение об ошибке в строке, где я возвращаю Content в блоке complete {}, ошибка выглядит следующим образом, а код ниже:

Описание Тип расположения пути к ресурсу не удалось найти неявное значение для параметра доказательства типа spray.httpx.marshalling.Marshaller[Content] MyService.scala строка 32 Проблема Scala

import akka.actor.Actor
import spray.routing._
import spray.http._
import MediaTypes._
import spray.json.DefaultJsonProtocol
import Content
import MyJsonProtocol._

class MyServiceActor extends Actor with MyService{

  def actorRefFactory = context

  def receive = runRoute(myRoute)
}

trait MyService extends HttpService {
  val myRoute =
    path("") {
      get {
        respondWithMediaType(`application/json`) { // XML is marshalled to `text/xml` by default, so we simply override here
          complete {
            new Content("1234", "Some Content", "YT", 60)
          }
        }
      }
    }
}

Может ли кто-нибудь увидеть что-то не так? Это буквально код шаблона спрея с добавлением материала спрей-json.


person ThaDon    schedule 22.08.2013    source источник


Ответы (1)


Json marshaller находится в трейте SprayJsonSupport, поэтому просто импортируйте его в область видимости:

import spray.httpx.SprayJsonSupport._

И с помощью этого маршаллера вы можете удалить директиву respondWithMediaType(application/json), потому что Json маршалируется только до типа носителя application/json:

implicit def sprayJsonMarshaller[T](implicit writer: RootJsonWriter[T], printer: JsonPrinter = PrettyPrinter) =
  Marshaller.delegate[T, String](ContentTypes.`application/json`) { value ⇒
    val json = writer.write(value)
    printer(json)
  }
person 4lex1v    schedule 22.08.2013
comment
Отлично, спасибо Алексей. Я пропустил этот ключевой момент в документации, есть ли он на spray.io? - person ThaDon; 22.08.2013