【问题标题】:error when handling POST containing JSON with Play2 + Spray使用 Play2 + Spray 处理包含 JSON 的 POST 时出错
【发布时间】:2018-08-02 06:44:21
【问题描述】:

在寻找大量教程和帖子但无法解决这个看似微不足道的问题后,我希望 Stackoverflow 再次帮助我。

我试图在我的 Scala + Play2 + Spray 应用程序中接收带有 POST 的 JSON,解析并存储它。我已经在不同的类中组织了这些东西,试图保持控制器的清洁:

对象定义:ElementManager.scala

case class Element (id:Int, paramOne:String){
  override def toString = id.toString + ": " + paramOne 
}

object MyJsonProtocol extends DefaultJsonProtocol {
  implicit object ElementJsonFormat extends RootJsonFormat[Element] {
    def write(e: Element) = JsObject(
      "id" -> JsNumber(e.id),
      "paramOne" -> JsString(e.paramOne))

    def read(value: JsValue) = {
      value.asJsObject.getFields("id", "paramOne") match {
        case Seq(JsNumber(id), JsString(paramOne)) =>
          new Element(id.toInt, paramOne)
        case _ => throw new DeserializationException("problem deserializing Element ")
      }
    }
  }
}

控制器。元素控制器。复制自https://playframework.com/documentation/2.0/ScalaJsonRequests

@Singleton
class JsonController @Inject() (cc: ControllerComponents, storage:ElementManager) extends AbstractController(cc) {
  def storepost = Action(parse.json) { request =>
    val elementResult = request.body.validate[Element]
    elementResult.fold(
      errors => {
        BadRequest(Json.obj("status" ->"KO", "message" -> JsError.toJson(errors)))
      },
      element => {
        Element.save(element)
        Ok(Json.obj("status" ->"OK", "message" -> ("Element '"+element.id+"' saved.") ))
      }
    )
  }

呼叫:

curl  --header "Content-type: application/json"  --request POST   --data '{"id": 3, "paramOne":"test"}'  http://localhost:9000/storepost

方法“storepost”应该接收一个 JSON,将其解析为一个元素并存储。但是,我不断收到以下错误。

Json deserializer found for type services.Element. Try to implement an implicit Reads or Format for this type.
[error]     val elementResult = request.body.validate[Element]

发生了什么事?为什么我实现的“读取”功能无法解析?我应该在“读取”功能旁边实现“读取”吗? (虽然这看起来并不优雅)。有没有更好的方法来获取 POST 解析它的信息?

额外问题:“PUT”方法的答案会有所不同吗?我假设不是,但我将不得不在我的项目中将它用于其他一些事情......

干杯!

【问题讨论】:

  • 您是否在控制器方法范围内导入了隐式格式?

标签: scala playframework-2.0 spray


【解决方案1】:

使用格式进行序列化和反序列化:

implicit val formatElement = Json.Format[Element]

然后你可以use request.body.validate[Element]

这会起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多