Я рекомендую использовать Spring @ControllerAdvice
для обработки ошибок валидации. Прочитайте это руководство для хорошего введения, начиная с раздела «Обработка ошибок Spring Boot». Для углубленного обсуждения есть статья в блоге Spring.io, которая была обновлена в апреле 2018 года.
Краткое описание того, как это работает:
ResponseEntity
. Он не будет нести ответственность за возврат ошибок или ответов об исключениях. @ControllerAdvice
@ExceptionHandler
ResponseEntity
При таком подходе вам нужно будет реализовать обработку исключений вашего контроллера только в одном месте для всех конечных точек в вашем API. Это также облегчает для вашего API единообразную структуру ответов на все конечные точки. Это упрощает обработку исключений для ваших клиентов.
У меня есть собственная инфраструктура Delphi / MySQL, которая позволяет мне очень быстро добавлять «новые экраны». Я не буду делиться этим, но могу описать свой подход:
Я использую интерфейс с вкладками и иерархию на основе TFrame. Я создаю вкладку и привязываю к ней TFrame.
Я беру на себя всю грязную сантехнику и элементы управления параллелизмом, используя стандартную реализацию хранимой процедуры mysql. CustomerSEL, CustomerGET, CustomerUPD, CustomerDEL и т. Д. TMFrame - мое происхождение, с реализациями интерфейса, захватывающими OnShow, OnHide и некоторые другие особенности
- TWebBrowserFrame --TDataAwareFrame --TObjectEditFrame --TCustomerEditFrame --TOrderEditFrame и т.д... --TObjectListFrame --TCustomerListFrame
и т.д ...
и некоторые диалоги ..
TDialog TMDialog --TDataAwareDialog --TObjectEditDialog - TContactEditDialog и т.д.. --TObjectSelectDialog --TContactSelectDialog
и т. Д.
Когда я добавляю новый объект для управления, это может быть новый атрибут клиентов, скажем, мы хотим отслеживать, какими автомобилями владеет клиент.
создать таблицу CustomerVehicles Я запускаю свой специальный генератор sproc, который создает мои SEL, GET, UPD, DEL проверить эти ...
Унаследовать от базовых классов, упомянутых выше, отбросить некоторые элементы управления. Добавьте вкладку в TCustomerEdit.
Delphi всегда имеет набор данных в качестве абстрактного уровня, предоставьте его своему графическому интерфейсу через источники данных. Добавьте набор данных в модуль данных клиента и «зарегистрируйте его». Моя собственная настраиваемая функция в моем производном классе модуля данных, TMDataModule
Контроль безопасности аналогичным образом заботится о структуре .. Я «Регистрирую» компоненты, которые требуют, чтобы флаг безопасности был видимым или включенным.
Обычно я могу добавить новый объект, построение sprocs, добавление экранов обслуживания в течение часа.
Конечно, обычно это только начало, обычно когда вы что-то добавляете, вы используете это не только для отслеживания. Если это приложение для гаража, мы хотим добавить автомобиль, который клиент привез в гараж, присвоить ему идентификатор, чтобы мы могли отслеживать историю. Но даже в этом случае это быстро.
Я пробовал нанимать субподрядчиков с молодыми парнями, использующими «новые инструменты разработки», и они, кажется, никогда не поверили мне, когда я сказал, что могу сделать это в десять раз быстрее с Delphi! Я могу сделать за два часа без ошибок то, что, кажется, заняло у них два дня, и у них все еще есть ошибки ...
НЕОБХОДИМО - Будьте осторожны, планируя свой VFI! Как кто-то упомянул, если вы хотите изменить имя компонента в одном из родительских классов, будьте готовы к неприятностям. Вам нужно будет открыть и «отредактировать» каждый дочерний элемент в иерархии, даже если вы очистите DCU, у вас все равно будет ад DFM. Могу заверить вас, что в 2006 году это все еще проблема.
НЕ создавайте один монстр-модуль данных
НЕ торопитесь с предварительным дизайном, рефакторинг после того, как вы создали тонну зависимых, может быть забавной задачей, но кошмар, когда нужно быстро получить что-то новое!
Будьте очень осторожны, если вы используете подход «поместить все объекты БД в один модуль больших данных» (или «несколько больших модулей данных» в огромных приложениях). Это может сделать ваш проект с модулем данных настолько большим, что вам придется использовать HD-монитор, чтобы увидеть все TXDataset в этом модуле данных
Итог: переходите на использование специализированных классов для бизнес-логики вместо модулей больших глобальных данных. Используйте модули глобальных данных с логикой ТОЛЬКО в очень небольших проектах.
Хорошо , Я настоятельно рекомендую вам использовать Действия (TActionList) при разработке пользовательского интерфейса. Существует множество предопределенных действий, включая следующие / предыдущие / вставки / удаления / редактирования / обновления, которые можно выполнять с наборами данных, поэтому рекомендуется использовать эти действия и связывать их с кнопками / меню в ваших формах. Это предотвращает повторение кода для логики пользовательского интерфейса.
Нет необходимости в генераторе CRUD для Delphi !! Добавьте TDataSource, TDBGrid и TActionList в форму, добавьте предопределенные действия источника данных в список действий, свяжите эти действия с кнопками или меню,
Использовать VFI (наследование визуальной формы). Разработайте стандартную форму БД. Например, пустой DataSet, DataSource, PageControl, состоящий из 2 листов. Сначала будет пусто, позже вы добавите элементы управления для редактирования данных в дочерних формах. Добавьте DBGrid на второй лист. Остерегайтесь, это не способ ООП, но он простой и быстрый.
Для Для больших приложений я использую структуру сохранения объектов tiopf . Это позволяет мне работать с объектами, а не наборами данных, и легко менять базы данных. Большая часть моей бизнес-логики переходит в модель бизнес-объектов (BOM), и мои формы довольно тупые. У tiopf есть несколько способов связать спецификации с формами; управление с учетом стойкости, Ttidataset для элементов управления с поддержкой данных и классы Mogel Gui Mediator для подключения к обычным элементам управления.
Для небольших и быстрых приложений я просто использую модули данных и компоненты базы данных. Главное помнить следующее: