【问题标题】:readNullable is not working in scala with play2readNullable 不能在带有 play2 的 scala 中工作
【发布时间】:2015-05-06 23:13:14
【问题描述】:

我正在验证来自 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.validate[SignUpValidation].toString 返回什么?也许您的 email 字段不是有效的电子邮件?
  • secondaryemail 是否作为空字符串提交?
  • @Infinity 我的错误响应在无效块中包含此内容 {"obj.secondryemail":[{"msg":"error.email","args":[]}]}}
  • @m-z 是的,它作为空字符串提交

标签: json scala playframework-2.0


【解决方案1】:

我认为它必须是您将表单转换为 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),)

【讨论】:

    【解决方案2】:

    首先要小心您的提示,它可能会导致您的代码出现拼写错误。我写了这个,这是可行的:

    首先使用伴随对象的案例类

    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) ))
          }
        )
      }
    

    在路由中使用 URL:

    POST   /testsignupvalidation controllers.Application.testSignUpValidation
    

    我使用 curl 和来自用户 Barry 的 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":[]}]}
    

    【讨论】:

      猜你喜欢
      • 2012-03-04
      • 1970-01-01
      • 2023-04-02
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多