2015-03-31 21 views
5

Chcę napisać walidację JSON dla kilku klas modeli Scala w grze 2.3.3. Używam JSON Reads, aby to zrobić zgodnie z instrukcjami (https://playframework.com/documentation/2.3.x/ScalaJsonCombinators). Ale pojawia się błąd "Aplikacja nie przyjmuje parametrów" i nie wiem jak to naprawić.Dlaczego otrzymuję komunikat "Aplikacja nie pobiera parametrów" przy użyciu JSON Read with Play framework 2.3?

Oto mój kod.

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

Czy możesz mi pomóc? Wszelkie rozwiązania i sugestie dotyczące walidacji JSON w Scala/Play są doceniane.

Odpowiedz

8

Typy obiektów Reads różnią się od typów stosowanych przez metodę apply. Np., readNullable[String] wyniki Option[String], a nie String. To samo dotyczy modeli BSONObjectId i Date. kompiluje, ale prawdopodobnie trzeba użyć niektórych mapy:

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

Można po odczycie, jak tak (CONVERT_TO_DATE jest urojony):

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

już spróbować, ale to nie działa mnie. Błąd jest taki sam. Jestem zmieszany. – Raysmond

+0

Mam coś do skompilowania i zaktualizowałem odpowiedź. –

+0

Dziękuję bardzo. Działa w ten sposób. – Raysmond