Spring AOP和RequestMapping注释

时间:2016-11-17 21:38:35

标签: spring spring-boot spring-aop

我正在创建一个类来审核对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();
...
...

我的一个Controller类看起来像这样 - 在类AND方法级别注释(此时我无法更改):

RestController
@CrossOrigin
@EnableConfigurationProperties
@RequestMapping(value = "/applications")
public class ApplicationController {

     ...
     ...


@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public ResponseEntity<Application> findById(@PathVariable Integer id) throws Exception {

  ...
  ...
}

我可以拉url,methodtype,参数很好。但是,我正在做的非常困难的事情是拉动Controller类的注释('/ applications'),这样我就可以为我的审计表构建完整的URL。

我知道还有其他审计选项(比如Spring Boot Actuator),但由于各种原因我需要使用这种方法,我只是被困在这里。 Spring的AnnotationUtils似乎会有所帮助,但我仍然坚持使用代码来获得类级别的注释。有没有人这样做过?

更新: 谢谢。那没用。你是对的 - 这是一个多余的部分,它在我删除'执行'部分但仍然是同样的问题时起作用。从本质上讲,问题是如何在这种情况下获得类级别的注释。因此,对于我的ApplicationsController类,如何检索在类级别定义的'/ applications'路径。我认为它在那里,但它嵌套在requestMapping对象的深层,我无法弄清楚如何提取它。目前,我只有解决方案是为我的控制器(ApplicationsController - &gt;'/ applications')创建一个HashMap,然后使用methodInvocation.targetClass作为该映射的键。添加控制器时,不是很优雅,需要维护。

1 个答案:

答案 0 :(得分:1)

您可以捕获这样的类级别注释:

@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
}