Элемент не может быть разрешен как переменная ошибка в пользовательской аннотации для перехвата метода - PullRequest
0 голосов
/ 23 марта 2019

Новое в Spring и программировании AOP. Работа над весенним учебным пособием AOP для написания аспектов, которые перехватывают вызовы методов Хотелось бы включить ведение журнала времени.

В соответствии с инструкциями из учебника я создал пользовательскую аннотацию для ведения журнала и аспект, определяющий, что следует делать при вызове этой аннотации. Код ниже является аннотацией TrackTime:

package com.in28minutes.springboot.tutorial.basics.example.aop;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

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

Однако Eclipse отображает ошибки - «Элемент не может быть преобразован как переменная / сохранение не может быть преобразовано в переменную»

Затем я создал аспект с именем MethodExecutionCalculationAspect с аннотацией «TrackTime».

@Around("@annotation(com.in28minutes.springboot.tutorial.
basics.example.aop.TrackTime)")

MethodExecutionCalculationAspect

package com.in28minutes.springboot.tutorial.basics.example.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;

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

@Around("@annotation
(com.in28minutes.springboot.tutorial.basics.example.aop.TrackTime)")

    public void around(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();

    joinPoint.proceed();
    long timeTaken = System.currentTimeMillis() - startTime;
    logger.info("Time Taken by {} is {}", joinPoint, timeTaken);
}

}

@ Around использует совет вокруг. Он перехватывает вызов метода и использует joinPoint.proceed () для выполнения метода. @annotation (com.in28minutes.springboot.tutorial.basics.example.aop.TrackTime) - это точка для определения перехвата на основе аннотации - @annotation сопровождается полным именем типа аннотации.

Как только я исправлю аннотацию и совет, я надеюсь использовать аннотацию для методов отслеживания времени. как показано ниже:

@Service
public class Business1 {
    @TrackTime
    public String calculateSomething(){

Любая помощь будет оценена.

Информация о проекте следующая:

SpringBootTutorialBasicsAplication.java: Класс приложения Spring Boot, созданный с помощью Spring Initializer. Этот класс действует как точка запуска приложения.

• pom.xml: содержит все зависимости, необходимые для построения этого проекта с использованием Spring Boot Starter AOP.

• Business1.java, Business2.java, Dao1.java, Dao2.java: Бизнес-классы зависят от классов DAO.

• Мы напишем аспекты для перехвата вызовов в эти бизнес-классы и классы DAO.

• AfterAopAspect.java: Реализует несколько советов после.

• UserAccessAspect.java: Реализует рекомендацию «Перед» для проверки доступа.

• BusinessAopSpringBootTest.java: модульный тест, который вызывает бизнес-методы.

• Maven 3.0+ - ваш инструмент для сборки • Затмение. • JDK 1.8 +

1 Ответ

2 голосов
/ 24 марта 2019

В вашем TrackTime отсутствует импорт для RetentionPolicy и Target.

import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
...