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

RestController的父类的Aspect方法不触发通知逻辑

唐焕
2023-03-14

我有一些构造我真的很想在上面使用一个方面。我想让我的RestController从一个类继承,这个类产生特殊的日志记录方法

  1. 记录到标准日志输出
  2. 向同样处理日志消息的服务激发http请求(由方面完成)

我创建了一个注释,用它来标记我想要呈现的方法,这样切入点就不能过滤它了。特殊情况是此方法是在RestController的父类中声明的。

请查看我的代码并检查我可能错过了什么以使其工作。

ApplicationClass

@SpringBootApplication
@ComponentScan("com.xetra.experimental")
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class AopTryoutApplication {

    public static void main(String[] args) {
        SpringApplication.run(AopTryoutApplication.class, args);
    }
}

RESTController

@RestController
public class Endpoint extends SimpleLogger {
  @GetMapping("/endpoint")
  public void doStuff(){
    log("foo");
  }
}
public class SimpleLogger implements EndpointLogger{
  @AspectAnnotation
  public void log(String msg) {
    System.out.println(msg);
  }
}
public interface EndpointLogger {
  void log(String msg);
}

注释我的方面应该切入点到

@Inherited
public @interface AspectAnnotation {
}

Spring AOP方面

@Component
@Aspect
public class TestAspect {

  @Pointcut("@annotation(com.xetra.experimental.aoptryout.AspectAnnotation)")
  public void methods() {
  }

  @Before("methods()")
  public void beforeMethodExecution(JoinPoint jp) {
    System.out.println("Aspect ran!!!!");
  }

}

共有1个答案

吕德业
2023-03-14

由于Spring的AOP框架基于代理的特性,目标对象内的调用根据定义是不被拦截的。

你可以在这里找到更多。

log方法的调用不会被拦截,因为它是从属于同一目标对象的dostuff方法发出的。

是的,你是对的!

有什么办法能让这一切顺利吗?比如使用AspectJ而不是Spring AOP?

您可以使用AspectJ的源代码编织使其工作。这里是一个工作示例。

 类似资料:
  • AnyLogic提供基于时间触发的传统交通灯。我正在创建一个新的道路交通管理系统,我想根据四条道路中最大的车辆密度触发交通灯。是否有任何功能或元素可以帮助我这样做?

  • 我对Android系统比较陌生,所以我在这里很困惑... NotificationReceiver.java manifest.xml

  • 如何指定用户点击通知包时要使用的意图?

  • 我有以下控制器: 我只找到了与mvc配置相关的部分:

  • 为什么我的子类方法不重写其父类中相同签名的方法? 我有一个类,它扩展了一个抽象类,后者扩展了抽象类Actor(这里的上下文是一个pong游戏)。和都有一个具有相同签名的方法: 目的是让方法重写的方法。这里的问题是,当我在内部调用时,只调用的方法。 在中的上设置的断点会脱扣,而在中的上设置的断点从不脱扣。我还在方法上尝试了,但它仍然调用方法。 目标是让对象以与其他对象不同的速度上下移动。因此方法也会

  • 我试图在我的应用程序中实现FCM,但我有一个问题。每当我发送通知时,它只显示默认通知,而不是调用自定义代码。我做错了什么? 这些是服务: