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)

Другие вопросы по тегам