Как стать автором
Обновить

Комментарии 6

А чем файл со схемой отличается от одного большого класса с кучей вложенный классов-dto'шек?
Ну кроме того, что dto'шки пишутся на привычной java, а язык описания схемы еще нужно освоить.
Кроме того, в dto'шках могут быть удобные методы для работы со свойствами, а в схеме - нет.

Я понимаю, схема удобна в качестве способа публикации API сервиса, но и в этом случае достаточно сгенерировать dto'шки 1 раз и положить их в исходниики.

Какой выигрыш вы получаете постоянно перегенерируя dto'шки по схеме при каждой сборке проекта?

В случае с большим классом необходимо потратить достаточно много времени на его описание в соответствии с примером json ответа сервера. Если ли же будет несколько эндпоинтов, то на каждый из них нужно писать свой большой класс, что увеличивает количество этих классов. А что если нужно написать интеграцию с несколькими серверами? Помимо описания ответа сервера могут быть еще и сложные dto для запросов. Это также дополнительные классы.

В случае генерации, для начала, можно воспользоваться онлайн генератором схемы из примера json ответа сервера. Дальше уже можно использовать эту схему как угодно:

  • Скорректировать ее по вашему усмотрению (переименовать классы, вынести все в defenitions и тд)

  • Можно наследоваться от генерируемых файлов, переопределяя свойства, которые необходимы или подкладывать свои реализации. В этом случае нужно в defenitions добавить что-то вроде:

"MyClass": { "existingJavaType": "com.example.demo.MyClass" }
  • И его уже использовать как $ref

  • Либо же можно просто скопировать сгенерированные файлы в привычное место и просто использовать их как обычные java классы. Тут уже решать вам.

Выигрыш от генерации файлов я вижу следующий:

  • Генерация классов по готовому json ответу занимает меньше времени, чем описание их вручную (конечно, можно воспользоваться онлайн генераторами классов из json ответа сервера)

  • Описание всего ответа сразу перед глазами в удобном формате

  • Гибкая настройка генерации (можно добавить генерацию билдеров одной настройкой плагина)

  • Можно спрятать большое количество dto файлов, чтобы они не мешали чтению проекта

  • Возможность подменять внутренние классы своими реализациями

я все еще не понимаю, зачем вам схема и зачем генерировать dto-шки каждый раз при пересборке проекта?

Если вам внешний сервис выдал схему, то да, можно 1 раз сгенерировать dto и положить в исходники. плагин не нужен.

если вам внешний сервис схемы не дал, то по json-у можно сразу сгенерировать dto-шки, минуя схему.

если вы хотите облегчить жизнь тем, кто будет интегрироваться с вашим сервисом, то тут схема, безусловно, поможет. Но зачем в этом случае плагин?

ну, ок. я могу придумать 1 вариант, когда это может быть полезно.
в случае, когда вы выкладываете схему в качестве "документации" к своему сервису, то перегенерация не даст вам забыть поправить собственные dto-шки при изменении файла со схемой.
наверное, единственный полезный вариант использования этого плагина.

но даже в этом случае, я бы генерировал схему по dto-шкам, а не наоборот.

еще мне кажется, что вы как-то пренебрежительно относитесь к dto.
не нужно их скрывать!

это полноценные классы проекта.

их можно (и нужно) обвесить аннотациями для валидатора, в них можно (и нужно) писать трасформирующие/аггрегирующие методы, работающие с полями dto, в них можно(и нужно) реализовывать бизнес логику, основанную на полях этого dto.

Давайте еще раз по порядку.

Для чего нужна схема? Я развернуто ответил на этот вопрос в предыдущем комментарии.

Зачем генерировать каждый раз при сборке проекта? Для того, чтобы при изменении схемы генерировались обновленные классы. При просмотре пулл реквестов на много удобнее отслеживать изменения в схеме, нежели в большом количестве классов. Генерация занимает всего доли секунды и практически не влияет на общее время сборки проекта.

По поводу бизнес логики в dto и прочее: что такое dto? Это data transfer object - т.е. простой класс для передачи данных. То, что вы описали идет в разрез с best practices. Dto должны быть простыми и содержать только данные, не содержать бизнес логики, данные должны валидироваться ДО создания dto и т.д.

Это data transfer object - т.е. простой класс для передачи данных. То, что вы описали идет в разрез с best practices.

Покажите пожалуйста эти best practices! DTO вовсе не обязаны буть анемичными и, уж точно, анемичные dto - это не best practices, а просто один из подходов. причем, весьма спорный.

данные должны валидироваться ДО создания dto

Вот это я не понял. Валидируем мы обычно входящие данные. Как вы собрались что-то валидировать ДО создания dto?
Нет, ну возможно, конечно, в самой json-схеме прописать соответствующие проверки (у вас в статье, кстати, об этом ни слова) и окончательно превратить все в реинкарнацию jaxb, но, кажется, цель была не в этом.
Ну и json-схема с валидациями сразу становится монструозной и отвратительно читаемой. Примерно как xsd. Для которой в итоге пришлось писать отдельные инструменты для редактирования.
И это вполне себе относится к следующему аргументу

При просмотре пулл реквестов на много удобнее отслеживать изменения в схеме,

нет. не проще. читать код все давно привыкли. читать язык описания json-схемы - надо привыкать, схема (с валидациями) занимает много экранов и инструментов для удобной работы с json-схемой пока не завезли.

кстати, предлагаю вам почитать о том, почему в свое время все устали работать с xsd-схемами и оценить, все ли старые "болячки" решены в json-схеме

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории