关于 JsonReaders 验证的 RuntimeException - Scala - ReactiveMongo

RuntimeException on validation of JsonReaders - Scala - ReactiveMongo

我有一个案例 classe 来存储我插入到用户中的 userOption。 我的用户结构是这样的:

{  
   "_id":ObjectId("55d54d05ece39a6cf774c3e4"),
"main":{  
  "providerId":"userpass",
  "userId":"test1@email.com",
  "firstName":"test",
  "lastName":"one",
  "fullName":"Test One",
  "email":"test1@email.com",
  "authMethod":{  
     "method":"userPassword"
  },
  "passwordInfo":{  
     "hasher":"bcrypt",
     "password":"aslkdjfasdjh"
    }
},
"userOption":{  
  "hotLeadNotification":{  
     "f":"IMMEDIATE"
  }
 }
   }

现在,我想添加一个附加选项:favoriteNotification。 我更改了案例 class 添加了 favoriteNotification:

    case class UserOption (
      hotLeadNotification: Frequency = Frequency("IMMEDIATE"),
    favoriteNotification: Frequency = Frequency("IMMEDIATE")
    )
    object UserOption{
  implicit val userOptionFormat = Json.format[UserOption]
implicit object BSONObjectIDFormat extends Format[BSONObjectID] {
    def writes(objectId: BSONObjectID): JsValue = JsString(objectId.toString())
    def reads(json: JsValue): JsResult[BSONObjectID] = json match {
      case JsString(x) => {
        val maybeOID: Try[BSONObjectID] = BSONObjectID.parse(x)
        if(maybeOID.isSuccess) JsSuccess(maybeOID.get) else {
          JsError("Expected BSONObjectID as JsString")
        }
      }
      case _ => JsError("Expected BSONObjectID as JsString")
    }
  }
val userOptionForm = Form(
  mapping(
        "hotLeadNotification" -> text, 
        "favoriteNotification" -> text
   )((hotLeadNotification: String, favoriteNotification: String) =>
   UserOption( 
   hotLeadNotification = Frequency(hotLeadNotification), 
   favoriteNotification = Frequency(favoriteNotification)
   )  
   )((u:UserOption) => Some(u.hotLeadNotification.f, u.favoriteNotification.f))
)  
 implicit object UserOptionBSONReader extends BSONDocumentReader[UserOption] {
    def read(doc: BSONDocument): UserOption = 
      UserOption(
      doc.getAs[Frequency]("hotLeadNotification").getOrElse(Frequency("IMMEDIATE")), 
      doc.getAs[Frequency]("favoriteNotification").getOrElse(Frequency("IMMEDIATE"))
      )

  }
  implicit object UserOptionBSONWriter extends BSONDocumentWriter[UserOption]{
    def write(userOption: UserOption): BSONDocument = 
      BSONDocument(
          "hotLeadNotification" -> userOption.hotLeadNotification, 
          "favoriteNotification" -> userOption.favoriteNotification

      )
  }

}

自从我添加了 favoriteNotification,我得到一个 RuntimeException:

java.lang.RuntimeException: (/userOption/favoriteNotification,List(ValidationError(error.path.missing,WrappedArray())))
    at scala.sys.package$.error(package.scala:27) ~[scala-library-2.11.6.jar:na]
    at play.api.libs.iteratee.Iteratee$$anonfun$run.apply(Iteratee.scala:355) ~[play-iteratees_2.11-2.3.9.jar:2.3.9]
    at play.api.libs.iteratee.Iteratee$$anonfun$run.apply(Iteratee.scala:348) ~[play-iteratees_2.11-2.3.9.jar:2.3.9]
    at play.api.libs.iteratee.StepIteratee$$anonfun$fold.apply(Iteratee.scala:670) ~[play-iteratees_2.11-2.3.9.jar:2.3.9]
    at play.api.libs.iteratee.StepIteratee$$anonfun$fold.apply(Iteratee.scala:670) ~[play-iteratees_2.11-2.3.9.jar:2.3.9]

但是我的代码中没有列表。我做错了什么?

感谢您的帮助

问题是 UserOption 是一个选项,而不是它的参数。因为我只添加了新选项 class 而不是在数据库中,所以它抛出了这个错误。 我将大小写 class 更改为添加选项:

   case class UserOption (
          hotLeadNotification: Option[Frequency] = Some(Frequency("IMMEDIATE")),
          favoriteNotification: Option[Frequency] = Some(Frequency("IMMEDIATE"))  
        )