2

基本的なシナリオ:

case class Something(
    date: Option[Date],
    timestamp: Option[Date] = Some(new Date)
);

class Users private() extends MongoRecord[Users] with ObjectIdPk[Users] {
    def meta = Users;
    object things extends MongoCaseClassListField[Users, Something](this);
};


object Users extends Users with MongoMetaRecord[Users] {

};     

def something(json: JValue) = {
    val something = json.extract[Something];// does not have a timestamp field.
    decompose(something); // again no timestamp field.
    Users.where(_.email eqs email).findAndModify(_.things addToSet something).updateOne(true);
};

問題:フィールドのない JSONtimestampが要求として送信されると、データベース エントリにフィールドがまったくありませんtimestamp

timestamp: Dateの代わりにを使用するtimestamp: Option[Date]と、JSON 抽出でMappingException.

Q:欠落している JSON フィールド/ケース クラス パラメータのデフォルト値をどのように設定できますか?

4

1 に答える 1

4

私はおそらく次のようなことを試してみます:

case class Something(date: Option[Date], timestamp: Option[Date]){
  def this(date:Option[Date]) = this(date, Some(new Date))
}

これにより、別の 1 つの引数のコンストラクターが作成され、デフォルトの日付が 2 つの引数のコンストラクターに渡されます。REPL で実行すると、タイムスタンプが正しく設定されているように見えることがわかります。

scala> parse(""" { "date":"2013-07-08T21:37:10Z" }  """)
res11: net.liftweb.json.JValue = JObject(List(JField(date,JString(2013-07-08T21:37:10Z))))

scala> res11.extract[Something]
res16: Something = Something(Some(Mon Jul 08 17:37:10 EDT 2013),Some(Mon Jul 08 17:43:52 EDT 2013))

scala> parse(""" {
     |   "date":"2013-07-08T21:37:10Z",
     |   "timestamp":"2013-07-08T21:37:10Z"
     | } """)
res14: net.liftweb.json.JValue = JObject(List(JField(date,JString(2013-07-08T21:37:10Z)), JField(timestamp,JString(2013-07-08T21:37:10Z))))

scala> res14.extract[Something]
res17: Something = Something(Some(Mon Jul 08 17:37:10 EDT 2013),Some(Mon Jul 08 17:37:10 EDT 2013))
于 2013-07-08T21:48:51.903 に答える