有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    原来的项目和新项目之间有一些显著的不同。新项目通过配置类将方面添加到上下文中,而旧(工作)项目通过组件扫描添加方面。切换到方面的组件扫描修复了问题。 坏的:

    @Configuration
    public class LoggerConfig {
    
        @Bean
        public SDKProfiler sdkProfiler() { return new SDKProfiler(); }
    }
    

    好:

    @Configuration
    @ComponentScan("com.company.app.logging")
    public class LoggerConfig {
    } 
    

    方面在com中的位置。公司应用程序。日志记录包

    感谢Abhijit花时间回复。我真的认为在发布之前,我已经考虑了项目之间的所有不同之处