有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在控制器类中使用自定义注释时,java自动连接不起作用

我试着为记录方法执行时间做一个自定义注释,它工作得很好,直到我对不在控制器类中的方法使用注释为止。在控制器类中使用时,其他类(服务类)的自动连接失败,并给出空指针异常

@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) 个答案

  1. # 1 楼答案

    您不能使用方面来“捕获”私有方法

    从Spring参考:

    由于Spring的AOP框架基于代理的特性,根据定义,受保护的方法不会被拦截,既不适用于JDK代理(如果这不适用),也不适用于CGLIB代理(如果这在技术上是可能的,但不推荐用于AOP目的)。因此,任何给定的切入点将只与公共方法匹配! 如果您的拦截需要包括受保护的/私有的方法,甚至是构造函数,请考虑使用Spring驱动的原生AspectJ编织,而不是Spring基于代理的AOP框架。这构成了一种不同的AOP使用模式,具有不同的特性,因此在做出决定之前,一定要先熟悉编织

    因此,您最好将方法更改为public>public String testTimeTaken()