嘿,我对喷芒果和反应性芒果很陌生。
我试图作为json返回一个结果列表,但是我在将结果转换为json列表时遇到了一些问题。
这是我的模型
import reactivemongo.bson.BSONDocumentReader
import reactivemongo.bson.BSONObjectID
import reactivemongo.bson.Macros
case class Post(id: BSONObjectID, likes: Long, message: String, object_id: String, shares: Long)
object Post {
implicit val reader: BSONDocumentReader[Post] = Macros.reader[Post]
}蒙戈法
def getAll(): Future[List[Post]] ={
val query = BSONDocument(
"likes" -> BSONDocument(
"$gt" -> 27))
collection.find(query).cursor[Post].collect[List]()
}这就是路线
val route1 =
path("posts") {
val res: Future[List[Post]]= mongoService.getAll()
onComplete(res) {
case Success(value) => complete(value)
case Failure(ex) => complete(ex.getMessage)
}
} 误差
type mismatch; found : List[com.example.model.Post] required: spray.httpx.marshalling.ToResponseMarshallable谢谢,
三木
发布于 2015-01-25 20:59:46
您需要定义如何序列化Post,这可以通过喷雾-json来实现(有关更详细的信息,请参见文档 )。这样做很容易,但在此之前,您还需要为BSONObjectId类型定义格式,因为在so中没有对该类型的内置支持(或者,如果object_id是BSONObjectId的字符串表示形式,请考虑从Post类中删除id属性或将其更改为字符串):
// necessary imports
import spray.json._
import spray.httpx.SprayJsonSupport._
implicit object BSONObjectIdProtocol extends RootJsonFormat[BSONObjectID] {
override def write(obj: BSONObjectID): JsValue = JsString(obj.stringify)
override def read(json: JsValue): BSONObjectID = json match {
case JsString(id) => BSONObjectID.parse(id) match {
case Success(validId) => validId
case _ => deserializationError("Invalid BSON Object Id")
}
case _ => deserializationError("BSON Object Id expected")
}
}现在,我们可以定义Post类的实际协议:
object PostJsonProtocol extends DefaultJsonProtocol {
implicit val format = jsonFormat5(Post.apply)
}此外,我们还需要确保我们的作用域中有定义的格式:
import PostJsonProtocol._现在,一切都将像预期的那样编译。
还有一件事:看看喷雾的关于DSL结构的文档。您的mongoService.getAll()不在complete块中,这可能无法反映您的意图。这还不是一个问题,但可能是如果你的路线变得更加复杂。要解决这个问题,只需将未来放入onComplete调用中,或使其变得懒惰:
val route1 =
path("posts") {
onComplete(mongoService.getAll()) {
case Success(value) => complete(value)
case Failure(ex) => complete(ex.getMessage)
}
} https://stackoverflow.com/questions/28130260
复制相似问题