未找到隐式 FromRequestUnmarsharell

Posted

技术标签:

【中文标题】未找到隐式 FromRequestUnmarsharell【英文标题】:Implicit FromRequestUnmarsharell not found 【发布时间】:2014-07-06 16:28:46 【问题描述】:

我正在尝试将我的域对象用作请求/响应正文参数。我正在使用喷雾路由和as[T] 来解组对象。但我不断收到could not find implicit value for parameter um: spray.httpx.unmarshalling.FromRequestUnmarshaller。尽管我已经手动将隐式解组器添加到伴随对象中,但我得到了同样的错误。我不知道出了什么问题。这个 JSON 序列化器/反序列化器用于我编写的 Event,因为我需要序列化 ​​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)

【问题讨论】:

我不确定您是否应该明确导入 FromRequestUnmarshaller。查看MarshallingDirectives available as in import from spray.routing package,然后在其中使用那些可用的高级处理程序方法。 【参考方案1】:

好的,我想通了。结构的顺序是错误的。第一个应该是伴随对象,第二个特征应该是路由。我不知道为什么,但是现在可以了。

【讨论】:

好收获。是的,这是 Scala 隐式解析规则的“特性”:为了避免类型推断中的歧义和循环,Scala 在搜索隐式值时只考虑同一文件中 above 的隐式定义。

以上是关于未找到隐式 FromRequestUnmarsharell的主要内容,如果未能解决你的问题,请参考以下文章

WebDriver 隐式等待未按预期工作

嵌套隐式游标未清除数据

隐式导航 - 未设置 GET 参数

隐式上下文未定义,角度 7

隐式超级构造函数 Person() 未定义。必须显式调用另一个构造函数?

Java错误:默认构造函数未定义隐式超级构造函数