使用 Play 表单实现 PATCH 操作

Implement PATCH operation with Play forms

您好,我在使用 Play 框架和表单(根据 https://www.rfc-editor.org/rfc/rfc6902)实施补丁操作时遇到了一些麻烦。这个想法是然后对补丁操作进行模式匹配来决定要采取什么行动。到目前为止我做了什么:

 val myForm = Form(
      tuple(
        "op" -> text.verifying(List("replace", "add").contains(_)),
        "path" -> text.verifying(List("/X", "/Y").contains(_)),
        "value" -> of[AnyRef] //does not compile :'(
      )
    )

导致以下错误:“找不到 AnyRef 的格式化程序类型 class。”

我知道我的值字段可以是不同的类型,具体取决于目标子资源,我该如何解决这个问题?

我最终没有使用 Play Forms,而是使用基本阅读器,做了类似的事情:

 case class PatchOperation(operation: String, path: String, value: JsValue)

  implicit val patchOperationReads: Reads[PatchOperation] = (
    (JsPath \ "op").read[String] and
      (JsPath \ "path").read[String] and
      (JsPath \ "value").read[JsValue]
    ) (PatchOperation.apply _)

在我的控制器中

request.body.asJson.map(js => js.validate[PatchOperation] match {
        case JsSuccess(patch, path) => {
          patch match {
            case PatchOperation("replace", "/subresource1", value) =>
              //here do something and parse the value
            case PatchOperation("add", "/subresource1", value) =>
              //here do something and parse the value
            case _ => BadRequest
          }
        }
        case JsError(patchOperation) => BadRequest
      }) getOrElse BadRequest