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

Popular posts from this blog

google api - Incomplete response from Gmail API threads.list -

Installing Android SQLite Asset Helper -

Qt Creator - Searching files with Locator including folder -