我有下面的代码片段,其中dataService返回OptionLocationDataResult。我希望在dataService返回None时设置NotFound,并在出现某些( ...)时将数据发送回来。
我有以下代码:
val route: Route = {
pathPrefix("service" / "data") {
pathPrefix( "infobox") {
get {
parameters(('mes.as[String], 'oks.as[String])) {
(me, okr) =>
val resp = dataService.ask(GetocationInfoboxData(me,okr)).mapTo[LocationInfoboxDataResult]
.map(remapInfoboxToResponseObject(_)).map { r =>
r match {
case None => StatusCodes.NotFound
case Some(dataToRespond) => dataToRespond
}
}
complete {
resp
}
}
}
}
}
}
implicit val responseMarhaller: Marshaller[LocationInfobox] = Marshaller.of[WikiLocationInfobox](ContentTypes.`application/json`) { (value, contentType, ctx) =>
val result: String = mapper.writeValueAsString(value)
ctx.marshalTo(HttpEntity(contentType, result))
}我无法从marshaller找到合适的方法,也无法通过完整的功能从路由找到合适的方法,我无法使其工作。
有没有更有经验的人能给我点提示?我是不是遗漏了一些重要的概念?
Thx
更新:错误消息“类型为FutureObject的表达式不符合预期的类型ToResponseMarsallable。
发布于 2015-08-10 21:00:35
代码看起来没问题,不确定有什么不起作用。试着用未来的Spray指令重写它,而不是完成未来本身:
val locationData = dataService.ask(GetocationInfoboxData(me,okr)).mapTo[LocationInfoboxDataResult]
onSuccess(locationData.map(remapInfoboxToResponseObject)) {
case None => complete(StatusCodes.NotFound)
case Some(data) => complete(data)
}发布于 2015-08-10 22:19:17
这对利用MetaMarshallers的我来说很好。
val resp = dataService.ask(GetocationInfoboxData(me, okr)).mapTo[LocationInfoboxDataResult].map(remapInfoboxToResponseObject(_)).map{
r =>
r match {
case None => Left(StatusCodes.NotFound)
case Some(data) => Right(data)
}
}
complete(resp)https://stackoverflow.com/questions/31919649
复制相似问题