Неявный FromRequestUnmarshare не найден

Я пытаюсь использовать свои объекты домена в качестве параметров тела запроса/ответа. Я использую спрей-маршрутизацию и as[T] для распаковки объекта. Но постоянно получаю could not find implicit value for parameter um: spray.httpx.unmarshalling.FromRequestUnmarshaller. Несмотря на то, что я вручную добавил неявный демаршаллер к сопутствующему объекту, я получаю ту же ошибку. Я понятия не имею, что случилось. Этот сериализатор/десериализатор JSON для событий я написал, потому что мне нужно сериализовать объект joda DateTime.

package services

import spray.routing.HttpService
import org.joda.time.DateTime
import org.joda.time.format.{DateTimeFormatter, ISODateTimeFormat}
import spray.httpx.unmarshalling.FromRequestUnmarshaller
import spray.json._
import services.EventsService.Event
import spray.httpx.SprayJsonSupport

trait EventsService extends HttpService {

  val eventsRoute =
    path("/events") {
      get {
        import EventsService._
        entity(as[Event]) { event =>
          complete(s"${event.toString}")
        }
      }
    }
}

object EventsService extends DefaultJsonProtocol with SprayJsonSupport{
  trait DateFormatter {
    val formatter: DateTimeFormatter
  }

  trait DateParser {
    val parser: DateTimeFormatter
  }

  implicit object EventFormatter extends RootJsonFormat[Event] with DateFormatter with DateParser {
    def read(json: JsValue): Event = json match {
      case obj: JsObject =>
        val name = obj.fields.get("name").map(_.asInstanceOf[JsString].value).
          getOrElse(deserializationError("field name not present"))
        val city = obj.fields.get("city").map(_.asInstanceOf[JsString].value).
          getOrElse(deserializationError("field city not present"))
        val starts = obj.fields.get("starts").map(x => parser.parseDateTime(x.asInstanceOf[JsString].value)).
          getOrElse(deserializationError("field starts not present"))
        val ends = obj.fields.get("ends").map(x => parser.parseDateTime(x.asInstanceOf[JsString].value)).
          getOrElse(deserializationError("ends field not present"))
        Event(name, city, starts, ends)
      case _ => deserializationError("wrong object to deserialize")
    }

    def write(e: Event): JsValue =
      JsObject(Map(
        "name" -> JsString(e.name),
        "city" -> JsString(e.city),
        "starts" -> JsString(formatter.print(e.starts)),
        "ends" -> JsString(formatter.print(e.ends))
      ))

    val formatter = ISODateTimeFormat.dateTimeNoMillis()
    val parser = ISODateTimeFormat.dateTimeNoMillis().withOffsetParsed()
  }

  case class Event(name: String, city: String, starts: DateTime, ends: DateTime)
}

person bkowalikpl    schedule 18.05.2014    source источник
comment
Я не уверен, что вы должны явно импортировать FromRequestUnmarshaller. Взгляните на MarshallingDirectives доступен как при импорте из пакета spray.routing, а затем использовать в нем эти доступные методы обработчика высокого уровня.   -  person S.R.I    schedule 19.05.2014


Ответы (1)


Хорошо, я понял это. Порядок структур неправильный. Сначала должен быть объект-компаньон, а второй черта с маршрутом. Я пока не знаю почему, но теперь это работает.

person bkowalikpl    schedule 19.05.2014
comment
Хороший улов. Да, это особенность правил неявного разрешения Scala: чтобы избежать двусмысленностей и циклов в выводе типа, Scala рассматривает только неявные определения в том же файле, которые находятся выше при поиске неявного значения. - person jrudolph; 19.05.2014