Возможно ли иметь несколько точек с разными аргументами в Spring AOP? - PullRequest
1 голос
/ 04 августа 2020

У меня есть один метод советов с несколькими точками. Можно ли иметь разные аргументы?

   @Around("execution(* com.admin.web.controller.*.*.*(javax.servlet.http.HttpServletRequest,com.admin.model.PortalRequestTransaction)) && args(request,portalRequestTransaction)"
        + " || execution(* com.admin.web.controller.BaselineImporterController.*(javax.servlet.http.HttpServletRequest,..)) && args(request)")
public Object auditAround(ProceedingJoinPoint joinPoint, HttpServletRequest request,
                          PortalRequestTransaction portalRequestTransaction) throws Throwable { // some code here }

Например, возможно ли, чтобы первый pointcut имел 2 аргумента, а второй - только один аргумент, а второй передавался как null? Если это невозможно, какое решение лучше?

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Один из способов добиться этого - использовать JoinPoint.getArgs () для получения аргументов метода в виде массива объектов. Это включает отражение.

Пример кода для достижения этого будет следующим:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class TestAspect {
    
    @Pointcut("execution(* com.admin.web.controller.*.*.*(javax.servlet.http.HttpServletRequest,com.admin.model.PortalRequestTransaction))")
    public void requestNTransaction() {}
    
    @Pointcut("execution(* com.admin.web.controller.BaselineImporterController.*(javax.servlet.http.HttpServletRequest,..))")
    public void requestAsFirstArg() {}

    @Around("requestNTransaction() || requestAsFirstArg()")
    public Object auditAround(ProceedingJoinPoint pjp) throws Throwable {
        // get the signature of the method to be adviced
        System.out.println(pjp.getSignature());
        Object[] args = pjp.getArgs();
        for(Object arg:args) {
            // use reflection to identify and process the arguments
            System.out.println(arg.getClass());
        }
        return pjp.proceed();
    }

}

Примечание:

  1. Отдельные методы, служащие сигнатуры Pointcut. Spring документация
  2. ProceedingJoinPoint для @Around тип совета
0 голосов
/ 04 августа 2020

Да, в вашем совете может быть несколько сокращений, и это делается с помощью этого общего c синтаксиса:

@AdviceType("execution(point-cut1) || execution(point-cut2) || execution(point-cut3)")
public void foo(){}

Обратите внимание, что @AdviceType и point-cutX являются концептуальными имена, и вы должны изменить их соответственно своим советом и pointcut [s].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...