【发布时间】:2019-01-03 14:41:57
【问题描述】:
下面是代表链接的简单文档。为此,我在 scala 中使用了 reactivemongo。
我在编译期间收到此错误:
app/components/Link.scala:60:11: 找不到类型的 Json 反序列化器 组件。链接。尝试为此实现隐式读取或格式 类型。 [error] .one[Link]) [error] ^ [error] 一个错误 找到了
我在我的 Link 伴随对象中创建了隐式,我也将它导入到我的 LinkRepo 类中。
我是否正确处理了 mongo 文档 _id?
我应该使用字符串映射到文档 ID,对最佳实践感到困惑吗?我是否必须在某些时候将字符串转换为 BSONObjectID?
package components
import javax.inject.Inject
import reactivemongo.bson._
import reactivemongo.api.ReadPreference
import reactivemongo.api.collections.bson.BSONCollection
import reactivemongo.bson.{ BSONDocument, BSONObjectID }
import reactivemongo.api.commands.{ UpdateWriteResult, WriteResult, Upserted }
import reactivemongo.api.commands.bson.BSONUpdateCommand._
import reactivemongo.api.commands.bson.BSONUpdateCommandImplicits._
case class Link(id: Link.ID,
name: String,
url: String)
object Link {
type ID = String
implicit val linkReader: BSONDocumentReader[Link] =
BSONDocumentReader[Link] { doc: BSONDocument =>
Link(
doc.getAs[String]("id").getOrElse(""),
doc.getAs[String]("name").getOrElse(""),
doc.getAs[String]("url").getOrElse(""))
}
implicit val linkWriter: BSONDocumentWriter[Link] =
BSONDocumentWriter[Link] { link: Link =>
BSONDocument(
"id" -> link.id,
"name" -> link.name,
"url" -> link.url)
}
}
import scala.concurrent.{ ExecutionContext, Future }
import reactivemongo.bson.{ BSONDocument, BSONObjectID }
import reactivemongo.api.{ Cursor, ReadPreference }
import reactivemongo.api.commands.WriteResult
import reactivemongo.play.json._
import reactivemongo.play.json.collection.JSONCollection
import play.modules.reactivemongo.ReactiveMongoApi
class LinkRepo @Inject()(implicit ec: ExecutionContext, reactiveMongoApi: ReactiveMongoApi) {
import Link._
def linksCol: Future[JSONCollection] = reactiveMongoApi.database.map(_.collection("links"))
def byId(id: Link.ID): Future[Option[Link]] = {
linksCol.flatMap(_.find(
selector = BSONDocument("_id" -> id),
projection = Option.empty[BSONDocument])
.one[Link])
}
}
我的 sbt 有这些 lib 版本:
scalaVersion := "2.12.7"
libraryDependencies += guice
libraryDependencies ++= Seq(
guice,
"joda-time" % "joda-time" % "2.9.9",
"net.ruippeixotog" %% "scala-scraper" % "2.1.0",
"org.reactivemongo" %% "play2-reactivemongo" % "0.16.0-play26",
"org.scalatestplus.play" %% "scalatestplus-play" % "3.1.2" % Test
)
插件:
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.20")
【问题讨论】:
-
您使用的是 JSON 集合,但提供的集合是 BSON,因此您需要确保来自
ImplicitBSONHandlers的转换是从reactivemongo.play.json导入的。 -
我同时添加了
import reactivemongo.play.json.ImplicitBSONHandlers和import reactivemongo.play.json._,但仍然出现同样的错误。 -
检查版本
-
@cchantep 我将我的版本添加到我的问题中。我正在使用 reactivemongo 0.16.0-play26。
标签: mongodb scala playframework play-reactivemongo