Я создаю класс для проверки вызовов моих классов контроллера Spring ботинка приложения в:Spring AOP и RequestMapping Аннотация
@Aspect
@Component
public class ServiceAudit { //RequestMappingInterceptor {
@Pointcut("@annotation(requestMapping) && execution(* *(..))")
public void controller(RequestMapping requestMapping) {}
@Before("controller(requestMapping)")
public void advice(JoinPoint thisJoinPoint, RequestMapping requestMapping) {
String url = requestMapping.value()[0];
String httpMethod = requestMapping.method()[0].toString();
...
...
Один из моих классов контроллеров выглядит следующим образом - с аннотациями в классе и методах уровня (который Я не могу измениться на данный момент):
RestController
@CrossOrigin
@EnableConfigurationProperties
@RequestMapping(value = "/applications")
public class ApplicationController {
...
...
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public ResponseEntity<Application> findById(@PathVariable Integer id) throws Exception {
...
...
}
Я могу вытащить url, methodtype, параметры в порядке. Тем не менее, у меня очень трудное время - это вытащить аннотацию класса контроллера («/ applications»), чтобы я мог создать полный URL-адрес моей таблицы аудита.
Я знаю, что есть другие варианты аудита (например, Spring Boot Actuator), но мне нужно использовать этот подход с аспектами по разным причинам, и я просто застрял здесь. Spring AnnotationUtils кажется, что это было бы полезно, но я застрял в коде, чтобы получить аннотации на уровне класса. Кто-нибудь когда-либо делал это?
ОБНОВЛЕНИЕ: Спасибо. Это не сработало. Вы правы - это был лишний кусок, и это сработало, когда я удалил часть «выполнения», но все тот же вопрос. По сути, проблема заключается в том, как я могу получить аннотацию на уровне класса в этом случае. Итак, для моего класса ApplicationsController, как мне получить путь '/ applications', определенный на уровне класса. Я думаю, что он там, но он вложен настолько глубоко в объект requestMapping, что я не могу понять, как его извлечь. На данный момент только у меня есть решение создать HashMap для моих контроллеров (ApplicationsController -> '/ applications'), а затем использовать методInvocation.targetClass как ключ к этой карте. Не очень элегантный и требует обслуживания, когда я добавляю контроллер.
попробовать, убирая исполнение (* (..)) от точки вырезать – kuhajeyan
спасибо. Это не сработало. Вы правы - это был лишний кусок, и это сработало, когда я удалил эту часть, но все еще ту же проблему. – Mike