Spring AOP Aspect advice с параметрами метода - PullRequest
1 голос
/ 21 марта 2019

У меня есть такой аспект, как следующий

@AfterReturning("execution(* de.ojk.platform.servicelayer.session.SessionService.getAttribute(..))")
public void fixUrl()
....

Метод getAttribute принимает только один параметр String.

что бы я хотел сделать, я хочу, чтобы «fixUrl» выполнялся только тогда, когда в качестве параметра указана строка «имя». "GetAttribute ( 'имя')". Как я могу это сделать? Спасибо!

Ответы [ 3 ]

0 голосов
/ 25 марта 2019

То, что вы спрашиваете, невозможно. Выражения pointcut метода являются мощными в различении, какие методы присоединиться или исключить, на основе сигнатуры и контекста. Значения самих аргументов находятся вне этой области.

В любом случае, я бы сказал, что в вашем коде есть условная проверка. Он более устойчив к поломкам от рефакторинга, особенно если вы устанавливаете значение, которое проверяете для константы.

0 голосов
/ 25 марта 2019

Вот ваш код аспекта:

@AfterReturning("execution(* de.ojk.platform.servicelayer.session.SessionService.getAttribute(..))")
    public void fixUrl(JoinPoint p){
        String name;
        Object[] signatureArgs = p.getArgs();
        if (signatureArgs.length > 0) {
            Class baseRequestClass = signatureArgs[0].getClass();
            try {
                Method requestIdMethod = baseRequestClass.getMethod("name");
                name = requestIdMethod.invoke(signatureArgs[0]) != null
                        ? requestIdMethod.invoke(signatureArgs[0]).toString() : null;

                if (name != null) {
                    System.out.println("Provided Name :" + name);
                } else {
                    System.out.println("No Name parameter provided");
                }

            } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    } 

Здесь имя имеет значение, которое предоставляется.Если ноль, то не предусмотрено.Я добавил журнал, есть имя имеет или нет.

Вот ваш импорт :

import org.aspectj.lang.JoinPoint;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.concurrent.ExecutionException;
0 голосов
/ 22 марта 2019
@AfterReturning(value = "execution(* de.ojk.platform.servicelayer.session.SessionService.getAttribute(..)) && args(String)")
public void after1(JoinPoint jp){
    System.out.println(jp.getArgs()[0]);
    System.out.println("after Return:"+jp.getSignature());
}

Над способом может работать.Если вы хотите поддерживать другой тип кроме String, измените String на то, что вы хотите.jp.getArgs () [0] получить переменную!Ниже вы можете попробовать, я успешно попробую в своем коде!

 @AfterReturning(value = "execution(@AfterReturning(value = "execution(* de.ojk.platform.servicelayer.session.SessionService.getAttribute(..)) && args(a)")
public void after2(JoinPoint jp,String a){
    System.out.println(a);
    System.out.println("after Return:"+jp.getSignature());
}
...