Изменить аргумент метода с аспектом - PullRequest
1 голос
/ 18 января 2020

недавно я искал, как изменить заголовки и тело объекта HttpServletRequest перед запуском контроллера logi c, единственный способ, который я нашел для достижения этой цели, - с аспектом, все хорошо с этим решением, но проблема в том, что у меня много классов контроллеров, мне нужно изменить значение заголовка Speci c в этих контроллерах, я добавил все свои классы в моем аспекте:

@Pointcut("execution(* com.mypackage.Controller1..*(..)) || " +
          "execution(* com.mypackage.Controller3.someMethod*(..))
           //A lot of methods and packages
private void anyMethodWithHeader(){

@Around("anyMethodWithHeader()")
    public ResponseEntity<Map<String, Object>> changeHeaderValue(ProceedingJoinPoint jp) throws Throwable{
        //Here I got the object array with the arguments that I need

Так что мой Вопрос в том, что в @PointCut есть способ поместить регулярное выражение или условное выражение или что-то подобное в одну или две строки, чтобы получить указанный c заголовок?

Я имею в виду, у меня есть много контроллеров, и эти контроллеры получают много заголовков, но я просто хочу изменить значение заголовка с именем test-token, все, что я хочу, это избегать добавления еще одной строки в моем аспекте каждый раз, когда я добавляю новый контроллер в моем проекте.

Я пытался добавить пакет @RequestHeader в моем аспекте и другие вещи, но ничего не работает.

Спасибо за комментарии.

Ответы [ 2 ]

1 голос
/ 21 января 2020

Вы прокомментировали:

@ kriegaex У меня все мои классы в определенном пакете, они @RestController, и во многих из этих классов у меня есть обязательный заголовок в аргументах метода, пример:

@RequestHeader(value = "my-header") String myHeader

Вы получаете все @RestController классы, подобные этим:

@within(org.springframework.web.bind.annotation.RestController)

Вы получаете все классы в определенном пакете (и его подпакетах), например:

within(a.certain.package..*)

Вы можете объединить это в

@within(org.springframework.web.bind.annotation.RestController) &&
within(a.certain.package..*) &&
execution(* *(..))

Часть execution(* *(..)) не требуется в Spring AOP, поскольку она поддерживает только точки соединения выполнения метода. В AspectJ вам это нужно, потому что там вы также можете перехватывать вызовы методов, конструкторы и другие точки соединения.

Если вы действительно можете на 100% полагаться на аннотацию параметра @RequestHeader во всех целевых методах, вы можете использовать

execution(* *(.., @org.springframework.web.bind.annotation.RequestHeader (*), ..))

, а также изолируйте аннотацию и ее значение, как я описал здесь с телом запроса (просто измените аннотацию, а также настройте остальную часть кода в соответствии с вашими потребностями).

Если бы вы могли полагаться на параметр заголовка запроса, чтобы он всегда находился в одной и той же относительной позиции в сигнатуре, например, во-первых, во-вторых, в-третьих, слева или справа, это было бы еще проще, поскольку вы могли напрямую связать параметр метода с методом-рекомендацией параметр через args(). Пожалуйста, дайте мне знать, если это так, и я могу показать вам пример.

0 голосов
/ 18 января 2020

Для pointcut может быть установлена ​​пользовательская аннотация, которая используется только для методов, которые вы хотите обрабатывать аспектом. В дополнение к точному контролю, когда применяется аспект, аннотация может иметь параметры, используемые самим аспектом (эффективно изменяющие его поведение).

Чтобы проиллюстрировать идею, вот мой небольшой проект, где это используется:


Несмотря на то, что аспекты являются мощными и очень полезными во многих ситуациях, в этом конкретном случае вы также можете использовать фильтр .

...