繁体   English   中英

readNullable在play2的scala中不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM