Scala 必需:spray.httpx.marshalling.ToResponseMarshallable错误
嘿,我对喷雾和反应性mongo很陌生 我试图将结果列表作为json返回,但在将结果转换为json列表时遇到了一些问题 这是我的模型 Mongo方法 这就是路线 错误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协议实现(有关详细信息,请参阅)。这样做
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.YourmongoService.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)
}
}