JavaSpringAOPSpectJ试图建议与切入点不匹配的类
我在一个项目中设置了AOP日志,但在另一个项目中却不起作用
从建造开始。格拉德尔:
compile "org.springframework.boot:spring-boot-starter-web:1.4.2.RELEASE"
[...]
compile "org.aspectj:aspectjrt:1.8.10"
compile "org.aspectj:aspectjweaver:1.8.10"
我有一个基本方面来记录一些API:
@Aspect
public abstract class Profiler {
private static final Logger logger = LoggerFactory.getLogger(getClass());
protected abstract void toLog();
@Around("toLog()")
public Object logAround(ProceedingJoinPoint joinPoint) {
[...]
我使用派生类来定义切入点:
@Aspect
public class SDKProfiler extends Profiler {
@Override
@Pointcut("execution(public * com.company.app.stuff.*.*(..))")
protected void toLog() {}
}
我已在配置中启用了带有@enableAspectProxy的aspecjtJ。 当我尝试在main中加载ConfigurableApplicationContext时,出现以下异常:
[...]
Caused by: java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut toLog
at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:207)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:193)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:170)
at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:220)
at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:279)
at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:311)
[...]
当Spring试图自动连接一个无论如何都与切入点表达式不匹配的类时,就会发生这种情况。如果我删除这个bean,它将以同样的方式对另一个与切入点表达式不匹配的bean失败。看看前面的问题,我看到人们通过升级AspectJ版本获得了成功。在撰写本文时,这不是一个选项,因为1.8.10是当前的最新版本
这段代码在类似的应用程序中正常工作,其中唯一明显的区别是构建工具maven。然而,没有编译时编织,所以这不应该是一个因素
你知道为什么spring试图在第三方类中找到与表达式不匹配的“toLog”切入点吗
# 1 楼答案
原来的项目和新项目之间有一些显著的不同。新项目通过配置类将方面添加到上下文中,而旧(工作)项目通过组件扫描添加方面。切换到方面的组件扫描修复了问题。 坏的:
好:
方面在com中的位置。公司应用程序。日志记录包
感谢Abhijit花时间回复。我真的认为在发布之前,我已经考虑了项目之间的所有不同之处