Ниже мой простой документ, представляющий ссылку. Для этого я использую реактивный монго в scala.
Я получаю эту ошибку во время компиляции:
app/components/Link.scala:60:11: Не найден десериализатор Json для компонентов типа. Ссылка. Попробуйте реализовать неявное чтение или формат для этого типа. [ошибка] .one[ссылка]) [ошибка] ^ [ошибка] найдена одна ошибка
Я создал имплициты в своем объекте-компаньоне Link, который также импортировал в свой класс LinkRepo.
Правильно ли я обрабатываю документ mongo _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")
ImplicitBSONHandlers
импортируются изreactivemongo.play.json
. - person cchantep   schedule 03.01.2019import reactivemongo.play.json.ImplicitBSONHandlers
, иimport reactivemongo.play.json._
, но все равно получаю ту же ошибку. - person Blankman   schedule 03.01.2019