【发布时间】:2023-01-10 00:03:03
【问题描述】:
我想将用于日志记录目的的 AOP 添加到我的 Spring Boot 应用程序中。但它似乎以意想不到的方式改变了我的应用程序的行为。
例如,我的应用程序有一个方法 doThis(),它创建一个 MyObject 实例:
MyObject myObect = doThis(); // a non-null myObject is returned from doThis()
效果很好,并且 myObject 已按预期填充了从 doThis() 返回的实例。但是我想要doThis()方法还通过 AOP 记录一些消息。
然后我添加以下方面类:
@Aspect
public class LoggingAspect {
private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
@Around("execution(* my.service.package.*.*(..))")
public void log(ProceedingJoinPoint joinPoint) throws Throwable {
logger.info("before");
joinPoint.proceed();
logger.info("after");
}
}
我还添加了这个配置类:
@Configuration
@ComponentScan(basePackages = "my.service.package")
@EnableAspectJAutoProxy
public class AppConfig {
@Bean
public LoggingAspect aspect() {
return new LoggingAspect();
}
}
然而,现在当我运行我的应用程序时,日志语句确实出现了,正如预期的那样——但现在同样的 doThis() 方法显然返回了一个空对象:
MyObject myObect = doThis(); // myObject is now unexplainedly null
但事实并非如此!我的意思是当我在doThis()的最后一行设置断点时,它即将返回的MyObject实例非常清楚不为空.它已在 doThis() 方法中创建和填充。那么它去了哪里?为什么myObject不是当doThis() 明确返回一个非空 MyObject 实例时得到填充?
似乎这个方面以某种方式使从 doThis() 返回的对象无效。有没有人见过这个?有什么办法吗?
我相信我的第一个*执行语句应该表明被拦截的方法可以有任何返回类型。但是我截获的方法的返回值似乎以某种方式更改为 null。
我正在研究如何根据评论创建一个“最小可重现示例”,我将在此处添加它,但这似乎是一个相当标准的 AOP 用例,所以同时将它扔到那里以防有人可能会有一些见识。
【问题讨论】:
-
请提供minimal reproducible example。你确认
myService.doThis()返回null了吗? -
myService.doThis()其实返回的是一个实体对象。而且这方面似乎有效。但是当我实际尝试保存返回的实体对象时它不起作用。 -
我要关闭你的错误消息“实体不能为空”
-
有趣的是 doThis() 似乎确实返回 null - 但仅在我添加方面代码之后。
-
请提供 minimal reproducible example 以便我们了解原因。
标签: java spring aop aspectj spring-aop