2016-04-12 1 views
1

有効な電子メールまたは空の文字列のみを許可する読み取り用のバリデーターを作成しようとしています。電子メールの検証、またはPlay/Scalaの空の文字列で読み取る

今まで私が試したことは、部分的にしか動作していないようです。正規表現でそれをやってみました、また

diverging implicit expansion for type play.api.libs.json.Reads[V] [error] starting with value uuidReads in trait DefaultReads [error]
(__ \ "value").read[String](email or maxLength(0)).map(EmailFieldValueForm.apply _)

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

とで

case class EmailFieldValueForm(value: String) extends FieldValueForm 

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

私はそれをテストするとき、私は次のエラーを取得しています:ここに は私がdefenitionを読み込んでこのケースでは、私が提供しているjsonは通過します。例:

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

私に空の値を与えても、検証に失敗しません。

私は間違っていますか?

おかげで、

SOLUTION は私が正しくテストをやっていなかったように思えます。以下は、働いていた:問題がdef maxLength[M](m: Int)(implicit reads: Reads[M], p: M => scala.collection.TraversableLike[_, M])

ためimplicit reads: Reads[M]にある

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

は、明示的タイプMを指定することも、すべてはあなたが使用することscalatest(PlaySpec)でのテストのために

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": "[email protected]"}""").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([email protected]),/value) 

罰金になります

Json.parse("""{"value": "sss"}""").validate[EmailFieldValueForm](emailFieldValueFormReads) must be an 'error 
Json.parse("""{"value": "[email protected]"}""").validate[EmailFieldValueForm](emailFieldValueFormReads) must be an 'success 
Json.parse("""{"value": ""}""").validate[EmailFieldValueForm](emailFieldValueFormReads) must be an 'success 
+0

これは何も変更しませんでした... –

+0

同じエラーがありますか? –

+0

それで、私がバリデーションメソッドを実行しているなら、それは機能します。しかし、単純な読み取りでも同様に検証することはできませんか?ポストのアップデート。 –

関連する問題