环境:play2.3 with reactivemongo
我阅读了reactivemongo 的coast-to-coast 文章,并且喜欢这篇文章的基础。目前,许多示例仍然超出我的理解范围,但我已经做到了。
作为探索这种方法的一部分,我正在构建一个简单的联系人 REST api。该方法通过 URL 传递一个父 ID,而正文包含其余部分。我坚持三件事。
- 如何向字符串添加最小/最大长度等验证规则
- 如何使字符串值可选
- 如何将参数注入 Json 值
- 如何在 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”调用不区分字符串值或对象。其他人是如何处理的?