【问题标题】:How to correctly present a JSON resource with Casbah & Play 2如何使用 Casbah & Play 2 正确呈现 JSON 资源
【发布时间】:2023-03-24 13:20:01
【问题描述】:

我是 Play 新手(对 Scala 还有些陌生),如果这有点离题,请原谅我,不过这确实是我在此处发布此内容的原因。

我正在尝试创建一个基本端点,它会消失并使用 mongodb 执行基本 CRUD。

controllers/NoteController.scala:

package controllers

import play.api.mvc._
import play.api.libs.json._
import data.Note

class NotesController extends Controller {

  def index = Action {
    Note.fetch match {
      case Some(notes) => Ok(Json.toJson(notes))
      case None => NotFound
    }
  }

  def show(id: Long) = Action {
    val note = Note.fetch(id)

    note match {
      case Some(note) => Ok(Json.toJson(note))
      case None => NotFound
    }
  }
}

data/Note.scala

package data

import com.mongodb.casbah.Imports._

object Note {

  def fetch = {
    Mongo.db("note").find
  }

  def fetch(id: Long) = {
    Mongo.db("note").findOne(
      MongoDBObject("id" -> id)
    )
  }
}

上面的代码实际上并不能正常工作,但在过去的几天里,我一直在用头撞墙,试图弄清楚如何实现它。我尝试过使用 casbah 附带的 JSON 序列化程序,但也没有任何乐趣。我似乎无法弄清楚如何从 mongo 数据(来自DBObject)到呈现相关的 JSON。

编辑:

正如对该问题的评论中所述,上述输出:

No Json serializer found for type Any. Try to implement an implicit Writes or Format for this type.

当它得到代码中的点时,它试图将note序列化为json:Ok(Json.toJson(note))

【问题讨论】:

  • 这段代码输出了什么?我以前没有尝试过在 Mongo 中使用 Play,但我知道 Json.toJson 会将 JSON 格式的字符串或普通对象(“bean”)转换为 JSON。所以我猜 Note.fetch 不会返回这些东西?
  • 不,这是我所拥有的简化版本,但实际上正是我想要做的,我猜它错误地说它正在将不适当的值传递给Json.toJson。我现在将运行它并将输出放入问题中。
  • 我建议使用更现代的 MongoDB Scala 驱动程序 (mongodb.github.io/mongo-scala-driver)。 Document 类有一个 toJson 方法,可以简化 Json 字符串的创建。

标签: json mongodb scala playframework casbah


【解决方案1】:

我建议你在你使用的所有方法上声明预期的返回类型。它会告诉你你的问题在哪里。我猜你认为你从 Node.fetch 返回了一个 List[JsValue],但实际上出于某种原因你返回了 Any

【讨论】:

    猜你喜欢
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多