Не найден сериализатор Json, так как найден JsObject для типа responsetivemongo.play.json.JSONSerializationPack.type

Я использую игровой фреймворк 2.5.3 с реактивным mongoDB.

import javax.inject._

import model._
import play.api.Logger
import play.api.libs.json._
import play.api.mvc._
import play.modules.reactivemongo._
import reactivemongo.api.ReadPreference
import reactivemongo.play.json._
import reactivemongo.play.json.collection._

import scala.concurrent.{ExecutionContext, Future}


class InsertController @Inject()(val reactiveMongoApi: ReactiveMongoApi)(implicit exec: ExecutionContext) extends Controller with MongoController with ReactiveMongoComponents {

def dataFuture: Future[JSONCollection] = database.map(_.collection[JSONCollection]("data"))

def createFromJson = Action.async(parse.json) { request =>
Json.fromJson[jsonWrapper](request.body) match {
  case JsSuccess(data, _) =>
    for {
      data <- dataFuture
      lastError <- data.insert(data)
    } yield {
      Logger.debug(s"Successfully inserted with LastError: $lastError")
      Ok("Inserted into db")

    }
  case JsError(errors) =>
    Future.successful(BadRequest("Something went wrong"))
}
}

Вот мой контроллер и при компиляции я получаю следующее исключение:

[info] Compiling 6 Scala sources and 1 Java source to /home/***/target/scala-2.11/classes...
[error] /home/***/app/controllers/InsertController.scala:38: No Json serializer as JsObject found for type reactivemongo.play.json.JSONSerializationPack.type. Try to implement an implicit OWrites or OFormat for this type.
[error]           lastError <- data.insert(data.pack)
[error]                                   ^
[error] one error found
[error] (compile:compile) Compilation failed
[info] Compiling 6 Scala sources and 1 Java source to /home/***/target/scala-2.11/classes...
[error] /home/***/app/controllers/InsertController.scala:38: No Json serializer as JsObject found for type reactivemongo.play.json.JSONSerializationPack.type. Try to implement an implicit OWrites or OFormat for this type.
[error]           lastError <- data.insert(data.pack)
[error]                                   ^
[error] one error found
[error] (compile:compile) Compilation failed
[error] application - 

! @705di1397 - Internal server error, for (GET) [/] ->

play.sbt.PlayExceptions$CompilationException: Compilation error[No Json serializer as JsObject found for type reactivemongo.play.json.JSONSerializationPack.type. Try to implement an implicit OWrites or OFormat for this type.]
    at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27)
    at play.sbt.PlayExceptions$CompilationException$.apply(PlayExceptions.scala:27)
    at scala.Option.map(Option.scala:145)
    at play.sbt.run.PlayReload$$anonfun$taskFailureHandler$1.apply(PlayReload.scala:49)
    at play.sbt.run.PlayReload$$anonfun$taskFailureHandler$1.apply(PlayReload.scala:44)
    at scala.Option.map(Option.scala:145)
    at play.sbt.run.PlayReload$.taskFailureHandler(PlayReload.scala:44)
    at play.sbt.run.PlayReload$.compileFailure(PlayReload.scala:40)
    at play.sbt.run.PlayReload$$anonfun$compile$1.apply(PlayReload.scala:17)
    at play.sbt.run.PlayReload$$anonfun$compile$1.apply(PlayReload.scala:17)

Он рекомендует написать Owrites или OFormat для JSONCollection, который является частью пакета activtivemongo.play.json._ и уже должен иметь эти определения, насколько я понимаю.

Вот мой класс jsonWrapper:

case class jsonWrapper(tables : tables, userId : String)


object jsonWrapper{
  implicit val jsonRead: Reads[jsonWrapper] = (
    (JsPath \ "tables").read[tables] and
      (JsPath \ "userID").read[String]
    )(jsonWrapper.apply _)

  implicit val jsonWrites: Writes[jsonWrapper] = (
    (JsPath \ "tables").write[tables] and
      (JsPath \ "userID").write[String]
    )(json => (json.tables, json.userId))

  implicit val jsonWrapperFormat : Format[jsonWrapper]  = Json.format[jsonWrapper]

}

Класс таблиц также имеет имплицитно определенный формат чтения и записи.

Я изначально использовал этот пример, чтобы начать: https://github.com/jonasanso/play-reactive-mongo-db, который работает, но когда я пытаюсь адаптировать его к моим потребностям (то есть с моим классом jsonWrapper), я получаю эта ошибка и не понимаю, почему она не работает.

Большое спасибо,

Питер М.

1 ответ

Решение

Я нашел свою ошибку.

def createFromJson = Action.async(parse.json) { request =>
Json.fromJson[jsonWrapper](request.body) match {
  case JsSuccess(data, _) =>
    for {
      data <- dataFuture
      lastError <- data.insert(data)
    } yield {
      Logger.debug(s"Successfully inserted with LastError: $lastError")
      Ok("Inserted into db")

    }
  case JsError(errors) =>
    Future.successful(BadRequest("Something went wrong"))
}

Моя запись дела инициирует объект с именем "data", который я отслеживаю, переопределяя мой объект dataFuture. Таким образом, вызывает ошибку. Я просто должен был изменить имена переменных...

Я упал как-то глупо.

Другие вопросы по тегам