我有以下代码片段,其中dataService返回Option [LocationDataResult]。 我想在dataService返回None时设置NotFound,并在Some(...)的情况下发回数据。
我有以下代码:
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
更新:错误消息“Future [Object]类型的表达式不符合预期类型ToResponseMarsallable。
答案 0 :(得分:0)
代码看起来不错,不确定什么不起作用。尝试使用Spray指令重写它,而不是完成未来:
val locationData = dataService.ask(GetocationInfoboxData(me,okr)).mapTo[LocationInfoboxDataResult]
onSuccess(locationData.map(remapInfoboxToResponseObject)) {
case None => complete(StatusCodes.NotFound)
case Some(data) => complete(data)
}
答案 1 :(得分:0)
这对我很有利,可以利用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)