2015-03-31 9 views
5

Play framework 2.3x'te birkaç Scala model sınıfı için JSON doğrulaması yazmak istiyorum. Talimatları izleyerek bunu yapmak için JSON Reads kullanıyorum (https://playframework.com/documentation/2.3.x/ScalaJsonCombinators). Ama "Uygulama parametreler almıyor" hatasını alıyorum ve nasıl düzelteceğimi bilmiyorum.Neden "Uygulama parametre almıyor" JSON Read with Play framework 2.3'ü kullanıyorum?

İşte kodum.

package models 

import play.api.libs.json._ 
import play.api.libs.json.Reads._ 
import play.api.libs.functional.syntax._ 
import reactivemongo.bson.BSONObjectID 
import java.util.Date 

case class ArtifactModel(
          _id: BSONObjectID, 
          name: String, 
          createdAt: Date, 
          updatedAt: Date, 
          attributes: List[AttributeModel], 
          stateModels: List[StateModel]) 

case class AttributeModel(
          name: String, 
          comment: String) 

case class StateModel(
         name: String, 
         comment: String) 

object ArtifactModel { 
    implicit val artifactModelReads: Reads[ArtifactModel] = (
     (__ \ "_id").readNullable[String] ~ 
     (__ \ "name").read[String] ~ 
     (__ \ "createdAt").readNullable[Long] ~ 
     (__ \ "updatedAt").readNullable[Long] ~ 
     (__ \ "attributes").read[List[AttributeModel]] ~ 
     (__ \ "stateModels").read[List[StateModel]] 
    )(ArtifactModel) // here is the error: "Application does not take parameters" 


    implicit val attributeModelReads: Reads[AttributeModel] = (
     (__ \ "name").read[String] ~ 
     (__ \ "comment").read[String] 
    )(AttributeModel) 

    implicit val stateModelReads: Reads[StateModel] = (
     (__ \ "name").read[String] ~ 
     (__ \ "comment").read[String] 
    )(StateModel) 
} 

Yardımcı olabilir misiniz? Scala/Play'de JSON doğrulama için herhangi bir çözüm veya öneri takdir edilmektedir.

cevap

8

Reads nesnesinin türleri, başvuru yönteminin aldığı ile aynı değildir. Ör., readNullable[String] sonuçları Option[String], değil String. BSONObjectId ve Date için aynıdır. Bu derler, ancak muhtemelen bazı haritalar kullanmak gerekir:

implicit val artifactModelReads: Reads[ArtifactModel] = (
(__ \ "_id").read[BSONObjectID] ~ 
    (__ \ "name").read[String] ~ 
    (__ \ "createdAt").read[Date] ~ 
    (__ \ "updatedAt").read[Date] ~ 
    (__ \ "attributes").read[List[AttributeModel]] ~ 
    (__ \ "stateModels").read[List[StateModel]] 
)(ArtifactModel.apply _) 

Bir okuma sonra, şöyle (CONVERT_TO_DATE hayali olan) olabilir:

implicit val artifactModelReads: Reads[ArtifactModel] = (
(__ \ "_id").read[BSONObjectID] ~ 
    (__ \ "name").read[String] ~ 
    (__ \ "createdAt").read[String].map(s=>CONVERT_TO_DATE(s)) ~ 
    (__ \ "updatedAt").read[Date] ~ 
    (__ \ "attributes").read[List[AttributeModel]] ~ 
    (__ \ "stateModels").read[List[StateModel]] 
)(ArtifactModel.apply _) 
+0

Bunu zaten çalışıyorum ama çalışmıyor ben mi. Hata aynıdır. Kafam karıştı. – Raysmond

+0

Derlemek için bir şey var ve cevabı güncellendi. –

+0

Çok teşekkürler. Bu şekilde çalışır. – Raysmond

İlgili konular