【发布时间】: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