Spring AOP 和 RequestMapping 注解
Spring AOP and RequestMapping Annotations
我正在创建一个 class 来审核对我的 Spring 启动应用程序控制器的调用 classes:
@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();
...
...
我的一个控制器 classes 看起来像这样 - 在 class 和方法级别带有注释(此时我无法更改):
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、方法类型和参数。但是,我很难做的是提取控制器 class' 注释('/applications'),这样我就可以为我的审计 table 构建完整的 URL。
我知道还有其他审计选项(例如 Spring Boot Actuator),但出于各种原因我需要将这种方法用于方面,我只是被困在这里。 Spring 的 AnnotationUtils 似乎会有所帮助,但我卡在代码上以获得 class 级别的注释。有人做过吗?
更新:
谢谢。那没有用。你是对的 - 那是一个多余的部分,当我删除 'execution' 部分时它起作用了,但仍然是同样的问题。本质上,问题是在这种情况下如何获得 class 级别的注释。因此,对于我的 ApplicationsController class,我如何检索在 class 级别定义的“/applications”路径。我想它就在那里,但它在 requestMapping 对象中嵌套得太深了,我不知道如何提取它。目前,我唯一的解决方案是为我的控制器创建一个 HashMap (ApplicationsController -> '/applications'),然后使用 methodInvocation.targetClass 作为该映射的键。添加控制器时不是很优雅并且需要维护。
您可以像这样捕获 class 级注释:
@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
}
我正在创建一个 class 来审核对我的 Spring 启动应用程序控制器的调用 classes:
@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();
...
...
我的一个控制器 classes 看起来像这样 - 在 class 和方法级别带有注释(此时我无法更改):
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、方法类型和参数。但是,我很难做的是提取控制器 class' 注释('/applications'),这样我就可以为我的审计 table 构建完整的 URL。
我知道还有其他审计选项(例如 Spring Boot Actuator),但出于各种原因我需要将这种方法用于方面,我只是被困在这里。 Spring 的 AnnotationUtils 似乎会有所帮助,但我卡在代码上以获得 class 级别的注释。有人做过吗?
更新: 谢谢。那没有用。你是对的 - 那是一个多余的部分,当我删除 'execution' 部分时它起作用了,但仍然是同样的问题。本质上,问题是在这种情况下如何获得 class 级别的注释。因此,对于我的 ApplicationsController class,我如何检索在 class 级别定义的“/applications”路径。我想它就在那里,但它在 requestMapping 对象中嵌套得太深了,我不知道如何提取它。目前,我唯一的解决方案是为我的控制器创建一个 HashMap (ApplicationsController -> '/applications'),然后使用 methodInvocation.targetClass 作为该映射的键。添加控制器时不是很优雅并且需要维护。
您可以像这样捕获 class 级注释:
@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
}