Я работаю над REST-API, реализованным в Скалатре, и с использованием reactivemongo. Моя постоянная модель реализована с использованием классов case, а тонкий слой репозитория использует общий подход для bson < -> сопоставление классов через DocumentReader/DocumentWriter (через неявные преобразователи в случае класса сопутствующего объекта).Scala + Reactivemongo: Управление пользовательскими читателями/писателями для REST-API
case class Address(street: String, number: String, city: String, zip: String)
object Address{
implicit val addressHandler = Macros.handler[Address]
implicit val addressFmt = Json.format[Address]
}
Первый форматировщик карты BSON к случаю классов второй обращенных JSON (формат вывода из REST-API).
Все это прекрасно, и я вполне доволен тем, насколько хорошо все интегрируется.
Во многих случаях мне не нужно работать с объектами домена (экземплярами класса case) и просто хотите передать данные, поступающие из базы данных, в ответ на http. Все промежуточные преобразования в этих сценариях являются накладными. Я также хочу контролировать, какие поля подвергаются (я когда-то использовал Йогу и Джексон в проекте Java).
Возможные решения для этого было бы:
- имеют общий репозиторий, который просто преобразует в структуре карты в качестве промежуточного формата.
- Управление неявными конвертерами, доступными для драйвера по каждому запросу, и классы записей для разных «представлений»
- Использовать BSONDocument как промежуточный формат и сделать слой REST понятным BSON посредством преобразования строки bson =>.
Интересно, что такое лучший подход, и если у кого-то есть опыт работы с этим конкретным сценарием. Может быть, я даже упустил еще один хороший вариант? Обратная связь очень приветствуется.
Вы можете сделать побережье до побережья с помощью 'JsValue' или' JsObject'. – cchantep
play-reactivemongo делает что-то подобное, и я думаю, что вы могли бы повторно использовать эту идею. – Barry
Побережье к побережью (https://www.playframework.com/documentation/2.1.0/ScalaJsonTransformers) выглядит очень многообещающим. Мне просто интересно, как уменьшить собственный код, необходимый для этого. Возможно, можно было бы реализовать более удобную для пользователя DSL с сопоставлением с образцом, которая переводится на комбинации трансформаторов. Но это будущее :) @cchantep Возможно, вы могли бы сделать свой комментарий ответом - я мог бы принять его :) – bennidi