2013-03-15 28 views
2

我試圖驗證解碼到Play2.1中的對象時的JSON。我定義的Format對象只在JSON中缺少一個字段時進行驗證,但我想驗證這些字段是否爲非空字符串。這可能嗎?我試過在reads()調用中指定minLength()約束(如here),但是我收到編譯器錯誤,說minLength找不到。那隻適用於元組方法嗎?播放2.1具有空字符串驗證的JSON格式

請參見下面的Specs2 JUnit測試現在失敗了,但應該通過當約束正確定義:

import org.specs2.mutable._ 
import play.api.libs.json._ 

class SimpleValidation extends SpecificationWithJUnit{ 

    private val badPayload: JsValue = Json.obj(
    "simpleValue1" -> "mySimpleValue", // Comment this line out to pass test 
    "simpleValue2" -> "" 
) 

    "An IssueFormat" should { 
    "validate when unmarshalling" in { 

     badPayload.validate[SimpleObj].fold(
     valid = (res => { 
      // Fail if valid 
      failure("Payload should have been invalid") 
     }), 
     invalid = (e => { 
      // Should be one error 
      e.length mustBeEqualTo(1) 
     })) 

    } 
    } 
} 

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

case class SimpleObj(simpleValue1: String, simpleValue2: String) 
object SimpleObj { 
    val simpleReads = (
    (__ \ "simpleValue1").read[String] and 
    (__ \ "simpleValue2").read[String])(SimpleObj.apply _) // read[String](minLength(0)) yields compiler error 
    val simpleWrites = (
    (__ \ "simpleValue1").write[String] and 
    (__ \ "simpleValue2").write[String])(unlift(SimpleObj.unapply)) 
    implicit val simpleFormat: Format[SimpleObj] = Format(simpleReads, simpleWrites) 
} 

回答

2

通過Play2.1文檔多一些期待後,我可以添加的是定製閱讀驗證器。如果將原始問題中的SimpleObj替換爲以下內容,則測試用例將通過。不知道是否有這樣做一個簡單的方法,但是這肯定工程:

object SimpleObj { 
    // defines a custom reads to be reused 
    // a reads that verifies your value is not equal to a give value 
    def notEqual[T](v: T)(implicit r: Reads[T]): Reads[T] = Reads.filterNot(ValidationError("validate.error.unexpected.value", v))(_ == v) 

    implicit val simpleReads = (
    (__ \ "simpleValue1").read[String](notEqual("")) and 
    (__ \ "simpleValue2").read[String](notEqual("")))(SimpleObj.apply _) 

    val simpleWrites = (
    (__ \ "simpleValue1").write[String] and 
    (__ \ "simpleValue2").write[String])(unlift(SimpleObj.unapply)) 
    implicit val simpleFormat: Format[SimpleObj] = Format(simpleReads, simpleWrites) 
} 
6

可以在讀取使用的minLength:

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

隨後的minLength應該可以,但是,嘗試這種格式相反:

implicit val simpleReads = (
    (__ \ "simpleValue1").read(minLength[String](1)) and 
    (__ \ "simpleValue2").read(minLength[String](1))(SimpleObj.apply _)