Как предотвратить запуск моего Spring-логинга? - PullRequest
0 голосов
/ 12 июня 2019

Мой код загрузки Spring имеет аспект ведения журнала, в котором записывается время, необходимое для завершения метода.Есть некоторые классы, для которых я не хочу этого поведения, поэтому я создал аннотацию NoLogging для размещения в классе, для которого не хочу запускать аспект.Но это не работает вообще.Я все еще вижу, как аспект работает на классах с моей аннотацией.Я недостаточно понимаю Spring AOP, чтобы точно знать, где я определяю !@annotation(org.apa.idem.sso.aspect.logging.NoLogging).Может кто-нибудь помочь?

Вот реализация этого аспекта:

@Component
@Aspect
public class IdemSsoLoggingAspect {
    private Logger logger = LoggerFactory.getLogger(this.getClass());

    /**
     * 
     * This method will calculate the Time taken by the public methods
     * 
     * 
     * @param joinPoint
     * @return
     * @throws Throwable
     */

    private final static String executionString = "!@annotation(org.apa.idem.sso.aspect.logging.NoLogging) && execution(public * org.apa.idem.sso.rest.*.*(..)) || execution(public * org.apa.idem.sso.web.controller.*.*(..)) || execution(public * org.apa.idem.sso.service.*.*(..)) ||   @annotation(org.apa.idem.erights.Transactional)";

    @Around(executionString)
    public Object logTimeMethod(ProceedingJoinPoint joinPoint) throws Throwable {
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
            Object retVal = joinPoint.proceed();
            stopWatch.stop();
            StringBuffer logMessage = new StringBuffer();
            logMessage.append(" execution time: ");
            logMessage.append(stopWatch.getTotalTimeMillis());
            logMessage.append(" ms");
            logMessage.append(joinPoint.getTarget().getClass().getName());
            logMessage.append(".");
            logMessage.append(joinPoint.getSignature().getName());
            logMessage.append("(");
            // append args
            Object[] args = joinPoint.getArgs();
            for (int i = 0; i < args.length; i++) {
                logMessage.append(args[i]).append(",");
            }
            if (args.length > 0) {
                logMessage.deleteCharAt(logMessage.length() - 1);
            }
            logMessage.append(")");
            logger.error("****************** Time taken  " + logMessage.toString());
            return retVal;
    }
}

Может кто-нибудь сказать мне, что я делаю не так?

1 Ответ

1 голос
/ 12 июня 2019

Вы должны поместить вторую часть условия в круглые скобки, потому что у вас есть операторы OR, которые будут истинными.

Итак, первая часть - это «не аннотация», а вторая часть - все остальное, кроме скобок.

!@annotation(org.apa.idem.sso.aspect.logging.NoLogging) 
    && (execution(public * org.apa.idem.sso.rest.*.*(..)) 
       || execution(public * org.apa.idem.sso.web.controller.*.*(..)) 
       || execution(public * org.apa.idem.sso.service.*.*(..)) 
       || @annotation(org.apa.idem.erights.Transactional))

А также в pointcut:

 @Pointcut("(within(@org.springframework.stereotype.Repository *)" +
    " || within(@org.springframework.stereotype.Service *)" +
    " || within(@org.springframework.web.bind.annotation.RestController *))"
    + " && !@annotation(org.apa.idem.sso.aspect.logging.NoLogging)")
...