【问题标题】:Spring AOP not working for model class in spring bootSpring AOP 不适用于 Spring Boot 中的模型类
【发布时间】:2021-10-14 15:49:34
【问题描述】:

我的切面类在启动时调用切面。

但是在调用下面提到的api之后,模型设置方法不是通过aspect处理的

@RestController
@AllArgsConstructor
@Slf4j
public class MyController {
  @PostMapping("/terms")
  public Mono<ResponseEntity<ModelResponse>> createCountryExceptionRule(@RequestBody ModelRequest model) {
    model.setField1("test");
    //some statements
  }
}
@Data
class ModelRequest{
  String field1;
  String field2;
}
@Aspect
@Component
class MyAspect {
  @Before("execution(public * *.set*(..))")
  public void test(JoinPoint joinPoint) {
    System.out.println("Before method:" + joinPoint.getSignature());
  }
}
@SpringBootApplication
@EnableAspectJAutoProxy(proxyTargetClass=true)
public class MyApplication {
  public static void main(String[] args) {
    SpringApplication.run(MyApplication.class, args);
  }
}

我添加的依赖项如下

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

如果我通过 http 请求调用 api,则不会调用方面

我在这里做错了什么还是我错过了什么?

【问题讨论】:

  • ModelRequest 不是 Spring 托管的 bean,因此 AOP 无法处理它。
  • 我已经用 @Component 注释了,还是一样的问题
  • 我重新格式化了您的示例代码,按类拆分代码块,添加语法突出显示和统一缩进。也许下次你可以自己做。顺便说一句,你的类没有导入,即除非有人碰巧知道 Lombok @Data 注释,否则她不会理解应该在哪里调用 setter。请为您未来的问题添加更多背景信息。非常感谢。

标签: java spring spring-boot aop spring-aop


【解决方案1】:

Spring AOP 仅适用于 Spring Container 托管 bean。 来自文档:5.2. Spring AOP Capabilities and Goals

Spring AOP 目前仅支持方法执行连接点(建议在 Spring bean 上执行方法)

createCountryExceptionRule() 方法的ModelRequest 参数实例不是Spring bean(用@Component 注释ModelRequest 类在此处无效)。

【讨论】:

    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多