Spring AOP и HttpServletRequest - PullRequest
       88

Spring AOP и HttpServletRequest

0 голосов
/ 27 мая 2020

Я работаю над аннотацией, которая будет отправлять некоторые события аудита в другой микросервис. Скажем, я создаю объект, и у меня есть метод add на моем контроллере Rest.

@PostMapping
@Audit
public ResponseEntity<EntityDTO> add(EntityDTO entity){
...
}

У меня определен соответствующий Аспект, связанный с аннотацией @Audit.

Но вот уловка, природа события аудита диктует, что мне нужно извлечь некоторые метаданные из самого HttpServletRequest.

И я не хочу изменять свою подпись, добавляя (или заменяя мою единственный аргумент) HttpServletRequest объект.

Как передать HttpServletRequest в свой аспект? Есть ли какой-нибудь изящный способ?

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Поскольку вы используете spring MVC, рассмотрите перехватчики Spring MVC вместо аспектов "generi c". Они изначально поддерживаются Spring MVC и могут предоставлять доступ как к обработчику, так и к HttpServletRequest объекту

См. этот учебник для использования перехватчиков и общей конфигурации

См. Эта ветка для получения некоторой информации об обработчике

final HandlerMethod handlerMethod = (HandlerMethod) handler; // this is what you'll get in the methods of the interceptor in the form of Object
final Method method = handlerMethod.getMethod();
0 голосов
/ 28 мая 2020

Ниже показано, как это можно сделать с помощью Spring AOP.

Пример аннотации.

@Retention(RUNTIME)
@Target({ TYPE, METHOD })
public @interface Audit {
    String detail();
}

И соответствующий аспект

@Component
@Aspect
public class AuditAspect {

    @Around("@annotation(audit) && within(com.package.web.controller..*)")
    public Object audit(ProceedingJoinPoint pjp, Audit audit) throws Throwable {
        // Get the annotation detail
        String detail = audit.detail();
        Object obj = null;
        //Get the HttpServletRequest currently bound to the thread.
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                .getRequest();
        try {
            // audit code
            System.out.println(detail);
            System.out.println(request.getContextPath());
            obj = pjp.proceed();
        } catch (Exception e) {
            // Log Exception;
        }
        // audit code
        return obj;
    }
}

NB: Op принял Ответ на основе перехватчика. Этот ответ призван продемонстрировать код Spring AOP для выполнения требований.

Надеюсь, это поможет

...