У меня есть:Play JSON Комбинаторы OrElse не работает на двойной поле
case class Product(
id: Option[Int],
name: String,
measure: Int,
qty: Double = 0
)
и неявное JSON Reads
в контроллере:
implicit val productReads: Reads[Product] = (
(JsPath \ "id").readNullable[Int] and
(JsPath \ "name").read[String] and
(JsPath \ "measure").read[Int] and
(JsPath \ "qty").read[Double].orElse(Reads.pure(0))
)(Product)
и здесь createProduct действие:
def createProduct = DBAction(parse.json) { implicit rs =>
rs.request.body.validate[Product].map { product =>
Logger.info(s"createProduct product:$product")
//...
Ok(toJson(product))
}.recoverTotal { errors =>
BadRequest(errors.toString)
}
}
Таким образом, поле qty
имеет значение по умолчанию 0
. Если клиент не отправил это поле, анализатор должен получить значение по умолчанию, но когда я хочу попробовать создать продукт, появляется следующее сообщение об ошибке:
JsError(List((/qty,List(ValidationError(error.path.missing,WrappedArray()))))
Вслед за JSON клиент послал:
{
"measure": 1,
"name": "meat"
}
Почему? Кто-нибудь знает, где моя ошибка?
ooh, вы абсолютно правы @ LimbSoup, я проверил поворот, я остаюсь старым "неявным val productFormat = Json.format [Product]", большое спасибо @LimbSoup !!! –