Автопроводка не работает при использовании пользовательских аннотаций в классе Controller - PullRequest
0 голосов
/ 01 февраля 2019

Я попытался создать пользовательскую аннотацию для времени выполнения метода протоколирования, и она работает нормально, пока я не использую аннотацию для метода, которого нет в классе контроллера.При использовании в классе контроллера автоматическое подключение другого класса (класса обслуживания) завершается неудачно и выдает исключение Null Pointer.

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExecutionTime {
}

-

@Aspect
@Component
public class ExampleAspect {

    @Around("@annotation(LogExecutionTime)")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();

        Object proceed = joinPoint.proceed();

        long executionTime = System.currentTimeMillis() - start;

        System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");
        return proceed;
    }

}

Когда я использую эту аннотацию в любом классе, кроме моего контроллера, он работает нормально.

@RestController
public class ProjectController {

    @Autowired
    ProjectService projectService;

    @GetMapping("/testTimeTaken")
    @LogExecutionTime
    private String testTimeTaken() {
        return projectService.dummyMethod();
    }

}

1 Ответ

0 голосов
/ 01 февраля 2019

Нельзя использовать аспекты, чтобы «поймать» приватный метод.

Из ссылки Spring:

Из-за основанной на прокси природе среды AOP среды Spring защищенные методы по определению не перехватываются ни для прокси-серверов JDK (если это не применимо)) ни для прокси-серверов CGLIB (если это технически возможно, но не рекомендуется для целей AOP).Как следствие, любой данный pointcut будет сопоставляться только с публичными методами!Если ваши потребности в перехвате включают защищенные / приватные методы или даже конструкторы, рассмотрите возможность использования собственного AspectJ-ткачества, основанного на Spring, вместо AOP-среды Spring на основе прокси.Это представляет собой другой способ использования АОП с другими характеристиками, поэтому обязательно ознакомьтесь с ткачеством, прежде чем принимать решение.

Поэтому лучшее, что вы можете сделать, это сделать ваш метод общедоступным.-> приватная строка testTimeTaken ()

...