[英]readNullable is not working in scala with play2
我正在验证来自UI的json我在案例类中有一个可选字段,我正在使用它进行验证和解析json,这是
case class SignUpValidation(firstNname : String,
var lastName: String,
var email: String,
var secondryEmail : Option[String] )
object SignUpValidation {
implicit val artworkReads: Reads[SignUpValidation] = (
(JsPath \ "firstname").read(minLength[String](1)) and
(JsPath \ "lastname").read(minLength[String](1)) and
(JsPath \ "email").read(email) and
(JsPath \ "secondryemail").readNullable(email)
)(SignUpValidation.apply _)
}
我正在验证这样的传入请求
jsonRequest.validate[SignUpValidation].fold(
valid = {
// validation successful
},
invalid = {
// validation failed
} )
当我未在secondryEmail字段中输入任何内容并提交数据时,验证应该成功,但运行无效的块
请指导我我的错误是什么
我认为必须是将表单转换为JSON。 从上面看起来它可能是一个空数组? 我可以使用不存在的辅助电子邮件或空的辅助电子邮件进行验证,如下所示:
import play.api.libs.json._
import play.api.libs.functional.syntax._
import play.api.libs.json.Reads._
case class SignUpValidation(firstNname : String,
var lastName: String,
var email: String,
var secondryEmail : Option[String] )
object SignUpValidation {
implicit val artworkReads: Reads[SignUpValidation] = (
(JsPath \ "firstname").read(minLength[String](1)) and
(JsPath \ "lastname").read(minLength[String](1)) and
(JsPath \ "email").read(email) and
(JsPath \ "secondryemail").readNullable(email)
)(SignUpValidation.apply _)
}
val js =
"""{
|"firstname":"bob",
|"lastname":"frank",
|"email":"bob@gmail.com",
|"secondaryemail":""
|}
""".stripMargin
val result = Json.parse(js).validate[SignUpValidation]
println(result)
val js2 =
"""{
|"firstname":"bob",
|"lastname":"frank",
|"email":"bob@gmail.com"
|}
""".stripMargin
val result2 = Json.parse(js2).validate[SignUpValidation]
println(result2)
控制台输出
js: String =
"{
"firstname":"bob",
"lastname":"frank",
"email":"bob@gmail.com",
"secondaryemail":""
}"
result: play.api.libs.json.JsResult[SignUpValidation] = JsSuccess(SignUpValidation(bob,frank,bob@gmail.com,None),)
js2: String =
"{
"firstname":"bob",
"lastname":"frank",
"email":"bob@gmail.com"
}"
result2: play.api.libs.json.JsResult[SignUpValidation] = JsSuccess(SignUpValidation(bob,frank,bob@gmail.com,None),)
首先,请小心小费,它可能导致代码的拼写错误。 我写这个,这可行:
首先,您的案例类带有伴侣对象
package models
import play.api.libs.json.{JsPath, Reads}
import play.api.libs.functional.syntax._
import play.api.libs.json.Reads._
/**
* Created by anquegi on 06/05/15.
*/
case class SignUpValidation(firstNname : String,
var lastName: String,
var email: String,
var secondryEmail : Option[String] ){
}
object SignUpValidation {
implicit val SignUpValidationReads: Reads[SignUpValidation] = (
(JsPath \ "firstname").read(minLength[String](1)) and
(JsPath \ "lastname").read(minLength[String](1)) and
(JsPath \ "email").read(email) and
(JsPath \ "secondryemail").readNullable(email)
)(SignUpValidation.apply _)
}
然后控制器中的POST方法
package controllers
import models.SignUpValidation
import play.api.libs.json.{JsError, Json}
import play.api.mvc._
object Application extends Controller {
def index = Action {
Ok("Play Framework Scala Stack OverFlow")
}
def testSignUpValidation = Action(BodyParsers.parse.json) { request =>
val signup = request.body.validate[SignUpValidation]
signup.fold(
errors => {
BadRequest(Json.obj("status" ->"KO", "message" -> JsError.toFlatJson(errors)))
},
signupObj => {
Ok(Json.obj("status" ->"OK", "message" -> ("signup "+signupObj.toString) ))
}
)
}
网址中包含网址:
POST /testsignupvalidation controllers.Application.testSignUpValidation
我使用了来自用户Barry的curl JSON来测试它:
[anquegi@localhost ~]$ curl --include --request POST --header "Content-type: application/json" --data '{"firstname":"bob","lastname":"frank","email":"bob@gmail.com"}' http://localhost:9000/testsignupvalidation
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 81
{"status":"OK","message":"signup SignUpValidation(bob,frank,bob@gmail.com,None)"}
[anquegi@localhost ~]$ curl --include --request POST --header "Content-type: application/json" --data '{ "firstname":"bob", "lastname":"frank", "email":"bob@gmail.com", "secondryemail":"bob2@gmail.com" }' http://localhost:9000/testsignupvalidation
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 97
{"status":"OK","message":"signup SignUpValidation(bob,frank,bob@gmail.com,Some(bob2@gmail.com))"}
小心secondryemail和secondaryemail当它为空字符串时,您不应提交secondryemail,否则,它将通过邮件验证程序失败,如下所示:
[anquegi@localhost ~]$ curl --include --request POST --header "Content-type: application/json" --data '{ "firstname":"bob", "lastname":"frank", "email":"bob@gmail.com", "secondryemail":"" }' http://localhost:9000/testsignupvalidation
HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Content-Length: 81
{"status":"KO","message":{"obj.secondryemail":[{"msg":"error.email","args":[]}]}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.