在方法拦截的自定义注释中无法将元素解析为变量错误

时间:2019-03-23 02:57:43

标签: spring annotations aspect

Spring和AOP编程的新手。在Spring 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显示错误– “元素无法解析为变量/保留项无法解析为变量”

然后我用“ TrackTime”注释创建了一个名为MethodExecutionCalculationAspect的方面。

@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 Initializer生成的Spring Boot应用程序类。此类充当应用程序的启动点。

•pom.xml:包含使用Spring Boot Starter AOP构建该项目所需的所有依赖项。

•Business1.java,Business2.java,Dao1.java,Dao2.java:业务类依赖于DAO类。

•我们将编写方面来拦截对这些业务类和DAO类的调用。

•AfterAopAspect.java:实现一些After建议。

•UserAccessAspect.java:实现“先行”建议以进行访问检查。

•BusinessAopSpringBootTest.java:调用业务方法的单元测试。

•Maven 3.0+是您的构建工具 •Eclipse。 •JDK 1.8 +

1 个答案:

答案 0 :(得分:2)

您的TrackTime缺少RetentionPolicyTarget的导入。

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