AspectJ: 只拦截 Rest 映射的端点,如何拦截内部调用的方法?
AspectJ: Only Rest mapped endpoints are intercepted, How to intercept internal called method?
我正在尝试使用注释 @Myfinder
和 return 值 Result
.
拦截方法 test()
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Myfinder {}
@Aspect
@Component
public class MyAspect {
@AfterReturning(value="@annotation(com.<MypackageHide>.MyFinder)",returning="result")
public void after(JoinPoint joinPoint, Result result) {
//something
}
但是只有我通过rest调用才会被拦截api /test
。即使从 repair()
方法调用此方法,我也想拦截。
@RequestMapping(path = "/repair")
@RestController
@Configurable
public class MyController {
@PostMapping("")
public ResponseEntity<String> repair() {
//some code
test(); // <=============== not intercepted if i call /repair
return ResponseEntity.ok("dummy");
}
@MyFinder
@PostMapping("/test") // <===== intercepted if i call this independently
public Result test() {
System.out.println("^^^^^^^");
return (Result) null;
}
}
即使我调用/repair
我也希望它被调用
我对 AOP 还很陌生
Spring AOP 适用于代理。从 repair() 调用 test() 称为自调用。 Spring AOP 将无法建议从 repair() 调用 test() 的方法,因为它不会通过代理。
Spring 参考文档:Understanding AOP Proxies。通读以 开头的部分 这里要理解的关键是 main(..)
中的客户端代码
如果您仍想拦截和建议这样的方法调用,您可以将控制器实例自动装配到相同的 class,如下所示。我建议您重构代码,但为了证明这种可能性,下面的代码会起作用。
@RequestMapping(path = "/repair")
@RestController
@Configurable
public class MyController {
@Autowired
MyController self;
@PostMapping("")
public ResponseEntity<String> repair() {
//some code
self.test(); // <=============== self reference
return ResponseEntity.ok("dummy");
}
@MyFinder
@PostMapping("/test") // <===== intercepted if i call this independently
public Result test() {
System.out.println("^^^^^^^");
return (Result) null;
}
}
我正在尝试使用注释 @Myfinder
和 return 值 Result
.
test()
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Myfinder {}
@Aspect
@Component
public class MyAspect {
@AfterReturning(value="@annotation(com.<MypackageHide>.MyFinder)",returning="result")
public void after(JoinPoint joinPoint, Result result) {
//something
}
但是只有我通过rest调用才会被拦截api /test
。即使从 repair()
方法调用此方法,我也想拦截。
@RequestMapping(path = "/repair")
@RestController
@Configurable
public class MyController {
@PostMapping("")
public ResponseEntity<String> repair() {
//some code
test(); // <=============== not intercepted if i call /repair
return ResponseEntity.ok("dummy");
}
@MyFinder
@PostMapping("/test") // <===== intercepted if i call this independently
public Result test() {
System.out.println("^^^^^^^");
return (Result) null;
}
}
即使我调用/repair
我对 AOP 还很陌生
Spring AOP 适用于代理。从 repair() 调用 test() 称为自调用。 Spring AOP 将无法建议从 repair() 调用 test() 的方法,因为它不会通过代理。
Spring 参考文档:Understanding AOP Proxies。通读以 开头的部分 这里要理解的关键是 main(..)
中的客户端代码如果您仍想拦截和建议这样的方法调用,您可以将控制器实例自动装配到相同的 class,如下所示。我建议您重构代码,但为了证明这种可能性,下面的代码会起作用。
@RequestMapping(path = "/repair")
@RestController
@Configurable
public class MyController {
@Autowired
MyController self;
@PostMapping("")
public ResponseEntity<String> repair() {
//some code
self.test(); // <=============== self reference
return ResponseEntity.ok("dummy");
}
@MyFinder
@PostMapping("/test") // <===== intercepted if i call this independently
public Result test() {
System.out.println("^^^^^^^");
return (Result) null;
}
}