2014-05-18 3 views
4

내 도메인 개체를 요청/응답 본문 매개 변수로 사용하려고합니다. 스프레이 라우팅과 as[T]을 사용하여 오브젝트를 언 마샬링합니다. 그러나 끊임없이 나는 could not find implicit value for parameter um: spray.httpx.unmarshalling.FromRequestUnmarshaller을 얻고있다. 내가 암시 적 unmarshaller를 수동으로 동반자 객체에 추가했는데 동일한 오류가 발생합니다. 나는 무엇이 잘못되었는지 전혀 모른다. joda DateTime 객체를 serialize해야하기 때문에 작성한 이벤트 용 JSON serializer/deserializer.Implicit FromRequestUnmarsharell을 찾을 수 없음

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) 
} 
+0

'FromRequestUnmarshaller'를 명시 적으로 가져 오기로되어 있는지 잘 모르겠습니다. 가져 오기 에서처럼 [MarshallingDirectives'] (https://github.com/spray/spray/blob/3fecb9fc3859f627e4c98b718f6347b27cd03b8f/spray-routing/src/main/scala/spray/routing/directives/MarshallingDirectives.scala)를 살펴보십시오. 'spray.routing' 패키지에서 찾은 다음 사용 가능한 highlevel 핸들러 메소드를 사용하십시오. –

답변

2

좋아, 알아 냈어. 구조의 순서가 잘못되었습니다. 첫 번째는 동반자 대상이어야하며 경로가있는 두 번째 특성이어야합니다. 나는 이유를 모르지만 아직은 효과가 있습니다.

+2

좋은 캐치. 예, 스칼라 암시 적 해석 규칙의 "기능"입니다. 형식 유추에서 애매한 점과 순환을 피하기 위해 Scala는 암시 적 값을 검색 할 때 * 위에 * 같은 파일에있는 암시 적 정의만을 고려합니다. – jrudolph