当前位置: 首页 > 知识库问答 >
问题:

AspectJ:只截获Rest映射的endpoint,如何截获内部调用的方法?[副本]

勾学博
2023-03-14

我试图使用注释@myfinder和返回值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调用它时才会截获它。即使从repaise()方法调用此方法,我也希望拦截。

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

我希望即使调用/repaine也能调用此函数

我对AOP相当陌生

共有1个答案

龚凌
2023-03-14

Spring AOP在代理上工作。从repair()调用test()称为自调用。Spring AOP将不能通知从repair()调用test()的方法,因为它不会通过代理。

Spring参考文档:了解AOP代理。通读这一节,首先要理解的关键是main(..)中的客户端代码

如果您仍然想要拦截和通知这样的方法调用,您可以将控制器实例autowire到同一个类,如下所示。我建议您重构代码,但为了演示这种可能性,下面的代码将会起作用。

@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;
    }
    }
 类似资料:
  • 有多篇关于如何在Spring AOP中拦截内部方法调用的帖子。但是找不到任何与使用AspectJ排除内部方法相关的帖子。我们希望使用AspectJ编译时编织来实现它promise的运行时性能改进。 如果另一个类的方法调用了下面类TestService中的任何公共方法,则应该拦截该调用。但是,不应该截取从method1()到method2()的内部调用。我们只希望拦截器对每个对象只拦截一次。 一个示

  • 问题内容: 除了LD_PRELOAD技巧和用您提供的系统内核替换某个系统调用的Linux内核模块外,是否有可能拦截一个系统调用(例如打开),以便它在实际打开之前先经过您的函数? 问题答案: 如果您确实需要解决方案,那么您可能会对可以完成此操作的DR rootkit感兴趣,请访问http://www.immunityinc.com/downloads/linux_rootkit_source.tbz

  • 我试图截取带注释方法的执行,以记录执行时间;因此,我创建了一个新注释: 我将注释应用于我想要跟踪的方法(该方法的类没有注释,如@Service或@Component;这是一个问题吗?) 然后我创建类和@周围方法: 我在pom中添加了spring boot starter aop依赖项,并在主类中添加了@EnableSpectProxy(带@SpringBootApplication注释的类)。我希

  • 我正在尝试使用来做同样的事情,现在我使用哪个注释来捕获相关的对象,切入点表达式应该是什么?我尝试了,但这是一个void方法,如何捕获该方法的参数?我是AOP的初学者,所以如果这个问题太琐碎,请原谅。 解决方案:使用spring AOP获取方法参数?

  • 问题内容: 我想拦截对某个类MyClass的所有方法调用,以便能够对某些setter调用做出反应。 我尝试使用动态代理,但据我所知,这仅适用于实现某些接口的类。但是MyClass没有这样的接口。 除了实现包装器类之外,还有其他方法可以将所有调用委派给成员(成员是MyClass的实例或使用AOP进行支持)吗? 问题答案: 如您所述,您不能使用JDK动态代理(无接口),但是使用Spring和CGLIB