Аз пиша play2 приложение, което получава данни чрез почивка / json и го съхранява в mongodb използване reactivemongo.
Използвам модел, изграден от казуси и implicit val myFormat = Json.format[myCaseClass]
Понастоящем имам казус за предмети, идващи от монгод. Те съдържат полето _id и всичко работи. Новите входящи обекти естествено нямат това поле за идентификация и така Json.fromJson[myCaseClass](req.body)
валидаторът е неуспешен.
Наистина ли трябва да създам друг клас случаи за нови обекти или има повече DRY и елегантно решение, без да дублираме класа и да премахнем _id?
Отговори:
0 за отговор № 1Бих използвал API за комбиниране на парсера и създавам json формат, или може би просто чете [T], който обработва входящи евентуално id-less полета. Нещо като:
implicit val readsMyClass: Reads[MyClass] = (
(__ "id").readNullable[Id] and
(__ "someProperty").read[String]
)(create _)
def create(maybeId: Option[Id], someProperty: String) =
MyClass(maybeId.getOrElse(...generate id...), someProperty)
Вижте документите за повече информация: http://www.playframework.com/documentation/2.2.x/ScalaJsonCombinators
0 за отговор № 2
Следвах предложенията и _id: Option[BSONObjectID]
прави трик. Не беше необходимо да се прилага четец, защото implicit val userFormat = Json.format[User]
е в състояние да създаде макрос, съдържащ опциите.