首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >必需: spray.httpx.marshalling.ToResponseMarshallable错误

必需: spray.httpx.marshalling.ToResponseMarshallable错误
EN

Stack Overflow用户
提问于 2015-01-24 21:07:40
回答 1查看 4.6K关注 0票数 1

嘿,我对喷芒果和反应性芒果很陌生。

我试图作为json返回一个结果列表,但是我在将结果转换为json列表时遇到了一些问题。

这是我的模型

代码语言:javascript
复制
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]
}

蒙戈法

代码语言:javascript
复制
 def getAll(): Future[List[Post]] ={
 val query = BSONDocument(
  "likes" -> BSONDocument(
    "$gt" -> 27))
   collection.find(query).cursor[Post].collect[List]()
}

这就是路线

代码语言:javascript
复制
val route1 =
  path("posts") {
    val res: Future[List[Post]]= mongoService.getAll()
    onComplete(res) {
      case Success(value) => complete(value)
      case Failure(ex)    => complete(ex.getMessage)
    }
  }    

误差

代码语言:javascript
复制
type mismatch; found : List[com.example.model.Post] required: spray.httpx.marshalling.ToResponseMarshallable

谢谢,

三木

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-25 20:59:46

您需要定义如何序列化Post,这可以通过喷雾-json来实现(有关更详细的信息,请参见文档 )。这样做很容易,但在此之前,您还需要为BSONObjectId类型定义格式,因为在so中没有对该类型的内置支持(或者,如果object_idBSONObjectId的字符串表示形式,请考虑从Post类中删除id属性或将其更改为字符串):

代码语言:javascript
复制
// 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类的实际协议:

代码语言:javascript
复制
object PostJsonProtocol extends DefaultJsonProtocol {
    implicit val format = jsonFormat5(Post.apply)
}

此外,我们还需要确保我们的作用域中有定义的格式:

代码语言:javascript
复制
import PostJsonProtocol._

现在,一切都将像预期的那样编译。

还有一件事:看看喷雾的关于DSL结构的文档。您的mongoService.getAll()不在complete块中,这可能无法反映您的意图。这还不是一个问题,但可能是如果你的路线变得更加复杂。要解决这个问题,只需将未来放入onComplete调用中,或使其变得懒惰:

代码语言:javascript
复制
val route1 =
  path("posts") {
    onComplete(mongoService.getAll()) {
      case Success(value) => complete(value)
      case Failure(ex)    => complete(ex.getMessage)
    }
  } 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28130260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档