Как заставить разработчиков писать пользовательскую аннотацию перед каждой загрузкой api Springboot

#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 методы, насколько я понимаю.