In spray for scala, get a FromRequestUnmarshaller from an ordinary Unmarshaller -
in scala spray, there way convert unmarshaller[t] fromrequestunmarshaller[t]. i'm stuck trying make entity directive work without using implicits. example:
... } ~ post {   path("mypath") {     entity(sprayjsonunmarshaller[mycaseclass](mycaseclassrootjsonformat)) { mycaseclass =>       complete { handle(mycaseclass) }     }   } ~ ... compiler error:
multiple markers @ line     - type mismatch; found : spray.httpx.unmarshalling.unmarshaller[mycaseclass] (which       expands to) spray.httpx.unmarshalling.deserializer[spray.http.httpentity,mycaseclass]       required: spray.httpx.unmarshalling.fromrequestunmarshaller[?] (which expands to)       spray.httpx.unmarshalling.deserializer[spray.http.httprequest,?]     - type mismatch; found : spray.httpx.unmarshalling.unmarshaller[mycaseclass] (which       expands to) spray.httpx.unmarshalling.deserializer[spray.http.httpentity,mycaseclass]       required: spray.httpx.unmarshalling.fromrequestunmarshaller[?] (which expands to)       spray.httpx.unmarshalling.deserializer[spray.http.httprequest,?] 
in part spray heavily depends on implicit resolution. might not correct, know there simple , elegant way this. designed should following directive: entity(as[mycaseclass]). then, if take @ as[_] directive, there not short way make simple unmarshaller (which takes entity , makes case class) fromrequestunmarshaller (from httprequest -> case class), implicit expanders can found [here] (https://github.com/spray/spray/blob/master/spray-httpx/src/main/scala/spray/httpx/unmarshalling/unmarshallerlifting.scala#l21). when calling entity(as[mycaseclass]) expands this:
entity {   as[mycaseclass] {     fromrequestunmarshaller[mycaseclass] {       frommessageunmarshaller[mycaseclass] {         sprayjsonunmarshaller[mycaseclass](mycaseclassrootjsonformat)       }     }   } } if want make explicit, should write in upper form. in way can drop as[mycaseclass]
on other hand may choose other explicit way - extract entity , convert json:
requestinstance { req =>   val json = req.entity.asstring.parsejson   json.convertto(mycaseclassrootjsonformat) } 
Comments
Post a Comment