作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定某种带有请求映射的 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/
我是一名优秀的程序员,十分优秀!