1

环境:play2.3 with reactivemongo

我阅读了reactivemongo 的coast-to-coast 文章,并且喜欢这篇文章的基础。目前,许多示例仍然超出我的理解范围,但我已经做到了。

作为探索这种方法的一部分,我正在构建一个简单的联系人 REST api。该方法通过 URL 传递一个父 ID,而正文包含其余部分。我坚持三件事。

  1. 如何向字符串添加最小/最大长度等验证规则
  2. 如何使字符串值可选
  3. 如何将参数注入 Json 值
  4. 如何在 Json 结构中添加子部分以获取地址?

有没有更好的方法来实现这一点?

第一部分是转换细节,但我想添加最大长度验证并将一些字段更改为可选。

val validateContact: Reads[JsObject] = (
  (__ \ 'fullname).json.pickBranch and
  (__ \ 'email).json.pickBranch( Reads.of[JsString] keepAnd Reads.email ) and
  (__ \ 'phone).json.pickBranch and
  (__ \ 'mobile).json.pickBranch( Reads.of[JsString] )  and
  (__ \ 'labels).json.copyFrom(labelsOrEmptyArray)
  //TODO: include address { street1, city, state, zip }
).reduce

val validateLabels = Reads.verifyingIf( (arr: JsArray) => !arr.value.isEmpty)(Reads.list[String])
val labelsOrEmptyArray = ((__ \ 'labels).json.pick[JsArray] orElse Reads.pure(Json.arr())) andThen validateLabels
val generateId = (__ \ '_id \ '$oid).json.put( JsString(BSONObjectID.generate.stringify) )
val generateCreated = (__ \ 'created \ '$date).json.put( JsNumber((new java.util.Date).getTime) )
val addMongoIdAndDate: Reads[JsObject] = __.json.update( (generateId and generateCreated).reduce )

这是控制器上的 REST 调用。注意需要添加到 Json 中用于存储在 Mongo 中的 parentid 参数。

def create(parentid:BSONObjectID) = Action.async(parse.json) { implicit request =>
  request.body.transform(validateContact andThen addMongoIdAndDate).map { result =>
    collection.insert(result).map { LastError =>
      Logger.debug(s"Successfully inserted with LastError: $LastError")
      Created
    }
  }.getOrElse(Future.successful(BadRequest("Invalid json")))
}

添加“keepAnd Reads.maxLength(20)”无法编译但许多示例显示它在使用中吗?有没有办法扩展验证功能集并添加我自己的?

更新1:我正在学习 Scala,所以在这一点上我可能忽略或误解了一些关于语言的简单事情。不久前,我对 Play1/Java 更加熟悉。

Update2:我还注意到“PickBranch”调用不区分字符串值或对象。其他人是如何处理的?

4

0 回答 0