Spring AOP和RequestMapping注释

Spring AOP和RequestMapping注释,spring,spring-boot,spring-aop,Spring,Spring Boot,Spring Aop,我正在创建一个类来审核对我的Spring Boot应用程序的控制器类的调用: @Aspect @Component public class ServiceAudit { //RequestMappingInterceptor { @Pointcut("@annotation(requestMapping) && execution(* *(..))") public void controller(RequestMapping requestMapping) {} @Befo

我正在创建一个类来审核对我的Spring Boot应用程序的控制器类的调用:

@Aspect
@Component
public class ServiceAudit { //RequestMappingInterceptor {
@Pointcut("@annotation(requestMapping) && execution(* *(..))")
public void controller(RequestMapping requestMapping) {}

@Before("controller(requestMapping)")
public void advice(JoinPoint thisJoinPoint, RequestMapping requestMapping) {
    String url = requestMapping.value()[0];
    String httpMethod = requestMapping.method()[0].toString();
...
...
我的一个控制器类如下所示-在类和方法级别上有注释(目前无法更改):

RestController
@交叉起源
@EnableConfigurationProperties
@请求映射(value=“/applications”)
公共类应用程序控制器{
...
...
@RequestMapping(value=“/{id}”,method=RequestMethod.GET)
公共响应findById(@PathVariable Integer id)引发异常{
...
...
}
我可以很好地提取url、methodtype和参数。但是,我很难做到的是提取控制器类的注释('/applications'),以便为我的审核表构建完整的url

我知道还有其他审计选项(如Spring Boot Actuator),但出于各种原因,我需要将这种方法用于方面,我只是停留在这里。Spring的AnnotationUtils似乎很有帮助,但我仍然停留在代码上,无法获得类级注释。有人这样做过吗

更新:
谢谢。这不起作用。你是对的-这是多余的,当我删除“执行”部分时它起作用了,但仍然是同一个问题。本质上,问题是在这种情况下如何获得类级注释。因此,对于我的ApplicationController类,我如何检索在类级定义的“/applications”路径。我认为这是一个问题在那里,但它嵌套在requestMapping对象中太深了,我不知道如何提取它。目前,我唯一的解决方案是为我的控制器(ApplicationController->'/applications')创建一个HashMap然后使用methodInvocation.targetClass作为该映射的键。不太优雅,在添加控制器时需要维护。

您可以捕获如下类级别的注释:

@Pointcut("@target(classRequestMapping) && @annotation(requestMapping) && execution(* *(..))")
public void controller(RequestMapping classRequestMapping, RequestMapping requestMapping) {}

@Before("controller(classRequestMapping, requestMapping)")
public void advice(JoinPoint thisJoinPoint, RequestMapping classRequestMapping, RequestMapping requestMapping) {
    // do whatever you want with the value
}

试着,从切割器上删除执行(**(..)这不起作用。你是对的-这是多余的一部分,当我删除该部分时它起了作用,但仍然是相同的问题。谢谢。这很有帮助。
@Pointcut("@target(classRequestMapping) && @annotation(requestMapping) && execution(* *(..))")
public void controller(RequestMapping classRequestMapping, RequestMapping requestMapping) {}

@Before("controller(classRequestMapping, requestMapping)")
public void advice(JoinPoint thisJoinPoint, RequestMapping classRequestMapping, RequestMapping requestMapping) {
    // do whatever you want with the value
}