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

Scala 必需:spray.httpx.marshalling.ToResponseMarshallable错误,scala,spray,reactivemongo,Scala,Spray,Reactivemongo,嘿,我对喷雾和反应性mongo很陌生 我试图将结果列表作为json返回,但在将结果转换为json列表时遇到了一些问题 这是我的模型 Mongo方法 这就是路线 错误 type mismatch; found : List[com.example.model.Post] required: spray.httpx.marshalling.ToResponseMarshallable 谢谢 miki您需要定义如何序列化Post,这可以通过spray json协议实现(有关详细信息,请参阅)。这样做

嘿,我对喷雾和反应性mongo很陌生

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

这是我的模型

Mongo方法

这就是路线

错误

type mismatch; found : List[com.example.model.Post] required: spray.httpx.marshalling.ToResponseMarshallable
谢谢


miki

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

现在,我们可以为
Post
类定义实际协议:

object PostJsonProtocol extends DefaultJsonProtocol {
    implicit val format = jsonFormat5(Post.apply)
}
此外,我们还需要确保在范围中定义了格式:

import PostJsonProtocol._
现在,一切都将按预期进行编译

还有一件事:看看spray.Your
mongoService.getAll()的用法
不在
complete
区块内,这可能无法反映您的意图。这还不是问题,但如果您的路线变得更复杂,则可能会出现问题。要解决此问题,只需将未来放入
onComplete
调用或使其变懒:

val route1 =
  path("posts") {
    onComplete(mongoService.getAll()) {
      case Success(value) => complete(value)
      case Failure(ex)    => complete(ex.getMessage)
    }
  } 

现在我在搜索查询中遇到了一个问题…collection.find(query).cursor[Post].collect[List]()无法找到参数读取器的隐式值:reactivemongo.bson.BSONDocumentReader[com.example.model.Post]方法游标的参数不足:(隐式读取器:reactivemongo.bson.BSONDocumentReader[com.example.model.Post],隐式ec:scala.concurrent.ExecutionContext)reactivemongo.api.Cursor[com.example.model.Post].Unspecified value parameters reader,ec.我在您的问题中没有看到任何搜索查询,但是您是否确保您的
Post
伴随对象的读取器在范围内?我在主帖子中添加了mongo方法,并导入了这个import com.example.model.PostJsonProtocolNo,我的意思是
BSONDocumentReader[Post]的读取器
似乎不可用。如果看不到您的完整代码,很难解释为什么会出现这种情况,因此我创建了一个包含完整列表的、适合我的。因此,您可能希望将您的版本与我的版本进行比较,以找出问题所在。您的代码运行良好,但当在trait中实现它时,我无法导入PostJsonProtocol.\uTrait MyService扩展HttpService{import PostJsonProtocol.\u0//won compile}
// 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")
    }
}
object PostJsonProtocol extends DefaultJsonProtocol {
    implicit val format = jsonFormat5(Post.apply)
}
import PostJsonProtocol._
val route1 =
  path("posts") {
    onComplete(mongoService.getAll()) {
      case Success(value) => complete(value)
      case Failure(ex)    => complete(ex.getMessage)
    }
  }