#java #spring #spring-boot
#java #spring #spring-boot
Вопрос:
Как мы можем заставить разработчика написать разработанную пользовательскую аннотацию в rest api
Пример: мы разработали аннотацию под названием: ValidatePermission
что нам нужно сделать, отображая ошибку времени выполнения для разработчика, что он пропустил аннотацию @ValidatePermission в API, когда он пытался написать новый api
@ValidatePermission
@GetMapping("/details")
@PreAuthorize("hasAuthority('902')")
public ResponseEntity<CustDtlsInqDto> getCustomerDetails(@CurrentUser UserPrincipal currentUser,
@RequestParam(name = "poiNumber", required = false) String poiNumber,
@RequestParam(name = "cif", required = false) String cif) {
return ResponseEntity.ok(customerService.getCustomerDetailsByPoiOrCif(currentUser.getId(), poiNumber, cif));
}
Комментарии:
1. Почему вы не используете Arch Unit для обеспечения соблюдения такого рода архитектурных решений?? archunit.org/getting-started . Я думаю, что можно обеспечить, чтобы классы, принадлежащие определенному пакету, были аннотированы с определенной аннотацией.
Ответ №1:
Использование аннотаций никоим образом нельзя принудительно использовать до или при компиляции (по крайней мере, я не знаю ни о какой технике, не стесняйтесь меня поправлять).
Единственный способ — выполнить проверку на этапе модульного тестирования. Просто напишите модульный тест, который просматривает компоненты определения REST API и его общедоступные методы (или аннотированные), чтобы проверить с помощью API отражения, присутствует ли аннотация из определенной категории (детали реализации на ваше усмотрение) в формальных параметрах методов.
Ответ №2:
Что-то мне кажется странным в этом подходе. Итак, вы говорите:
… отображение ошибки времени выполнения для разработчика, что он пропустил аннотацию @ValidatePermission в API
Основываясь на этой фразе, позвольте мне предложить альтернативу:
Итак, разработчик, который запускает проект локально (во время сеанса отладки или, возможно, тестов), должен увидеть ошибку, если он / она не поместил аннотацию в методы контроллера rest, верно?
Если да, то почему вам не нужно, чтобы разработчики помещали эту аннотацию?
Основная идея моего предложения такова: почему бы не позволить spring сделать это за вас автоматически?
Вы могли бы реализовать какой-то аспект или, если вы не хотите использовать spring aop и предпочитаете «необработанный простой spring», BeanPostProcessor, который «обернет» все методы класса, аннотированные RestContoller (путем создания прокси-сервера во время выполнения), и перед запуском метода контроллера будет выполнена логикаэто должно было поддерживаться аннотацией?
В случае Web MVC другой подход заключается в реализации перехватчика, который будет автоматически вызываться spring mvc engine, и вы сможете выполнить любую пользовательскую логику, которую вы хотите там, вы также сможете вводить другие компоненты (например, вспомогательные службы) в перехватчик.
Прочитайте эту статью, если вы не знакомы с этими перехватчиками, вам понадобятся preHandle
методы, насколько я понимаю.