读取Play / Scala中的电子邮件或空字符串验证

时间:2016-04-12 05:19:53

标签: json scala validation playframework

我正在尝试为只允许有效电子邮件或空字符串的读取创建验证器。

到目前为止,我尝试的只是部分工作。 这是我的读取辩护:

case class EmailFieldValueForm(value: String) extends FieldValueForm

val emailFieldValueFormReads: Reads[EmailFieldValueForm] =
    (__ \ "value").read[String](email or maxLength(0)).map(EmailFieldValueForm.apply _)

当我测试它时,我收到以下错误:

  

为play.api.libs.json.Reads [V]类型分散隐式扩展   [错误]以特征DefaultReads [error]中的值uuidReads开头   (__ \"值")。读[String](电子邮件或   maxLength(0))。map(EmailFieldValueForm.apply _)

此外,尝试使用正则表达式:

val emailFieldValueFormReads: Reads[EmailFieldValueForm] =
    (__ \ "value").read[String](email or pattern("""^$"""r)).map(EmailFieldValueForm.apply)

在这种情况下,我提供的任何json都在传递。例如:

val invalidJson = Json.parse(
        """
          |{
          | "value": "boo"
          |}
        """.stripMargin

只需给我一个空值,但验证不会失败。

我做错了什么?

谢谢,

好像我没有正确地进行测试。以下工作:

val invalidJson = Json.parse(
        """
          |{
          | "value": "boo"
          |}
        """.stripMargin
      )

      (EmailFieldValueForm.emailFieldValueFormReads reads invalidJson match {
        case JsSuccess(value, _) => value
        case JsError(e) => throw JsResultException(e)
      }) must throwA[JsResultException]

1 个答案:

答案 0 :(得分:1)

问题在于implicit reads: Reads[M] def maxLength[M](m: Int)(implicit reads: Reads[M], p: M => scala.collection.TraversableLike[_, M])

您可以明确指定类型M,一切都会没问题

import play.api.libs.functional.syntax._
import play.api.libs.json.Reads._
import play.api.libs.json._

val emailFieldValueFormReads: Reads[EmailFieldValueForm] =
  ((__ \ "value").read[String](email or maxLength[String](0))).map(EmailFieldValueForm.apply _)

Json.parse("""{"value": "sss"}""").validate[EmailFieldValueForm](emailFieldValueFormReads)
Json.parse("""{"value": ""}""").validate[EmailFieldValueForm](emailFieldValueFormReads)
Json.parse("""{"value": "a@a.com"}""").validate[EmailFieldValueForm](emailFieldValueFormReads)

scala> res0: play.api.libs.json.JsResult[EmailFieldValueForm] = JsError(List((/value,List(ValidationError(List(error.email),WrappedArray()), ValidationError(List(error.maxLength),WrappedArray(0))))))

scala> res1: play.api.libs.json.JsResult[EmailFieldValueForm] = JsSuccess(EmailFieldValueForm(),/value)

scala> res2: play.api.libs.json.JsResult[EmailFieldValueForm] = JsSuccess(EmailFieldValueForm(a@a.com),/value)

使用scalatest(PlaySpec)进行测试时,您可以使用

Json.parse("""{"value": "sss"}""").validate[EmailFieldValueForm](emailFieldValueFormReads) must be an 'error
Json.parse("""{"value": "a@a.com"}""").validate[EmailFieldValueForm](emailFieldValueFormReads) must be an 'success
Json.parse("""{"value": ""}""").validate[EmailFieldValueForm](emailFieldValueFormReads) must be an 'success