2016-11-17 3 views
0

Я создаю класс для проверки вызовов моих классов контроллера 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 как ключ к этой карте. Не очень элегантный и требует обслуживания, когда я добавляю контроллер.

+0

попробовать, убирая исполнение (* (..)) от точки вырезать – kuhajeyan

+0

спасибо. Это не сработало. Вы правы - это был лишний кусок, и это сработало, когда я удалил эту часть, но все еще ту же проблему. – Mike

ответ

0

Вы можете захватить аннотации уровня класса, как это:

@Pointcut("@target(classRequestMapping) && @annotation(requestMapping) && execution(* *(..))") 
public void controller(RequestMapping classRequestMapping, RequestMapping requestMapping) {} 

@Before("controller(classRequestMapping, requestMapping)") 
public void advice(JoinPoint thisJoinPoint, RequestMapping classRequestMapping, RequestMapping requestMapping) { 
    // do whatever you want with the value 
} 
+0

Спасибо. Это было полезно. – Mike

Смежные вопросы