微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AspectJ:只拦截 Rest 映射的端点,如何拦截内部调用的方法?

如何解决AspectJ:只拦截 Rest 映射的端点,如何拦截内部调用的方法?

我正在尝试使用注释 test() 和返回值 @Myfinder 拦截方法 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;
    }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。