AspectJ:只拦截REST映射的端点,如何拦截内部调用的方法? [英] AspectJ: Only Rest mapped endpoints are intercepted, How to intercept internal called method?

查看:20
本文介绍了AspectJ:只拦截REST映射的端点,如何拦截内部调用的方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用批注@Myfinder截取方法test()并返回值Result

@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(..)

中的客户端代码

如果您仍然希望拦截和建议这样的方法调用,您可以将控制器实例自动绑定到相同的类,如下所示。我建议您重构代码,但为了演示这种可能性,可以使用以下代码。

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

这篇关于AspectJ:只拦截REST映射的端点,如何拦截内部调用的方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆