2016-03-15 2 views
0

Привет, я получаю некоторые проблемы, связанные с выполнением патчей с использованием рамок и форм Play (согласно https://tools.ietf.org/html/rfc6902). Идея состоит в том, чтобы затем сопоставить шаблон для операции патча, чтобы решить, что нужно предпринять. До сих пор, что я достиг делать:Реализовать операцию PATCH с формами воспроизведения

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

Результирующая следующее сообщение об ошибке: «Не удается найти Formatter класса типа для AnyRef.»

Как это можно обойти, зная, что мое поле значений может быть другого типа в зависимости от целевого субресурса?

+0

может быть 'value' проверить как«не пустая строка» и после того, как вы сможете проанализировать необходимый тип? –

+0

Я планировал сделать сопоставление образцов на моем объекте AnyRef, чтобы он был гибким и приятным. Но это тоже будет способ сделать это! –

ответ

1

Я в конечном итоге не используя Play формы, но вместо того, чтобы основные читатели, делать что-то вроде:

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 
Смежные вопросы