gpt4 book ai didi

java - 如何从 Spring Controller 获取 AOP 建议中的 RequestMapping 请求?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:50:36 24 4
gpt4 key购买 nike

给定某种带有请求映射的 Controller

@RequestMapping(value="/some/path", method=RequestMethod.POST)

如何在方面类中检索方法值 (RequestMethod.POST)?

我想跟踪执行 POST 请求的所有 Controller 方法。

谢谢

最佳答案

@AL13N:你自己的回答是正确的,但如果你只是将注解绑定(bind)到一个参数上,就不需要使用反射。这是 POJO + AspectJ 中的示例。不过在 Spring AOP 中它应该是相同的:

带有 main 方法的示例 Controller :

package de.scrum_master.app;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class MyController {
@RequestMapping(value="/some/path", method=RequestMethod.POST)
public void foo() {
System.out.println("foo");
}
public void bar() {
System.out.println("bar");
}

public static void main(String[] args) {
MyController controller = new MyController();
controller.foo();
controller.bar();
}
}

看点:

package de.scrum_master.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.web.bind.annotation.RequestMapping;

public aspect RequestMappingInterceptor {
@Pointcut(
"within(@org.springframework.stereotype.Controller *) && " +
"@annotation(requestMapping) && " +
"execution(* *(..))"
)
public void controller(RequestMapping requestMapping) {}

@Before("controller(requestMapping)")
public void advice(JoinPoint thisJoinPoint, RequestMapping requestMapping) {
System.out.println(thisJoinPoint);
System.out.println(" " + requestMapping);
System.out.println(" " + requestMapping.method()[0]);
}
}

顺便说一句,切入点的 && execution(* *(..)) 部分在 Spring AOP 中可能不是必需的,因为无论如何它只知道执行切入点。在 AspectJ 中,您需要排除 call() 和其他类型的切入点,因为 AspectJ 更强大。不过,它不会造成伤害,而且更安全、更明确。

控制台输出:

execution(void de.scrum_master.app.MyController.foo())
@org.springframework.web.bind.annotation.RequestMapping(headers=[], name=, value=[/some/path], produces=[], method=[POST], params=[], consumes=[])
POST
foo
bar

编辑: 交换参数以使连接点成为第一个建议方法参数,因为 Spring AOP 似乎坚持这个顺序而 AspectJ 不坚持。

关于java - 如何从 Spring Controller 获取 AOP 建议中的 RequestMapping 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26933623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com