Spring AOP работает в одном методе и не работает в другом из того же класса
Я использую Spring AOP для пользовательской аннотации, где он отлично запускается другим методом, но не работает в нижеупомянутом методе. Я новичок в концепции АОП, поэтому, пожалуйста, помогите. Я попытался использовать тот же АОП для другого метода, который работает отлично. Я не знаю, что это происходит. Рано я узнал о прокси-сервере jdk, метод вызова должен быть общедоступным, поэтому я изменил его, даже если это не решило мою проблему.
Пользовательская аннотация ниже
package com.abc.xyz.common.logger;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UPIPGLog {
String type() default "OTHER";
boolean logParams() default true;
String[] skipRegexInResponseLog() default {};
String[] maskInResponseLog() default {};
}
Аспект ниже
package com.abc.xyz.common.logger;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.EnumUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
@Aspect
@Order(3)
public class UPIPGAutologger{
@Around("execution(@com.abc.xyz.common.logger.UPIPGLog * *(..)) && @annotation(upipgLog)")
public Object performanceLog(ProceedingJoinPoint joinPoint, UPIPGLog upipgLog) {
Object response = null;
-
-
-
}
}
Метод вызова
package com.abc.xyz.handler.gateway.impl.opt.idk;
@Component
public class ABC implements XYZ {
@UPIPGLog
@Override
public <RESPONSE> RESPONSE getAPIResponse(LogType logType, Integer timeoutInSeconds, String url,
String payload, Class<RESPONSE> responseClass, HTTPRequestType requestType, String contentType,
Map<String, Object> headers, Map<PGConfigParameters, Object> config) {
//
//
}
}
2 ответа
getAPIResponse
должен быть вызван другим компонентом, если вы просто вызовете его внутренне, простой механизм на основе прокси не будет работать.
Пример:
public void someMethod() {
this.getAPIResponse(...)
}
Вызовы локальных или внутренних методов в рекомендованном классе не перехватываются прокси, поэтому метод advise аспекта не запускается / не вызывается.
Я вызывал метод только из внутреннего метода класса. Спасибо @Andreas за упоминание в комментариях.
попробуйте использовать полный путь внутри @annotation,
@annotation(com.abc.xyz.common.logger.UPIPGLog)