Scala 未找到隐式FromRequestUnmarsharell
我正在尝试使用我的域对象作为请求/响应主体参数。我正在使用喷洒布线和Scala 未找到隐式FromRequestUnmarsharell,scala,spray,spray-json,Scala,Spray,Spray Json,我正在尝试使用我的域对象作为请求/响应主体参数。我正在使用喷洒布线和as[T]来解组对象。但我经常得到无法找到参数um:spray.httpx.unmarshalling.FromRequestUnmarshaller的隐式值。尽管我已经将隐式解组器手动添加到伴生对象,但我还是会遇到同样的错误。我不知道怎么了。这个JSON序列化程序/反序列化程序用于我编写的事件,因为我需要序列化joda DateTime对象 package services import spray.routing.Http
as[T]
来解组对象。但我经常得到无法找到参数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)
}
好的,我已经弄明白了。结构的顺序是错误的。第一个特征应该是同伴对象,第二个特征应该是路线。我不知道为什么,但它现在起作用了。我不确定您是否应该显式地从RequestUnmarshaller导入。请查看导入自spray.routing
包中的可用as,然后使用其中可用的高级处理程序方法。很好。是的,这是Scala隐式解析规则的一个“特性”:为了避免类型推断中的歧义和循环,Scala在搜索隐式值时只考虑上面相同文件中的隐式定义。