Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring AOP AspectJ试图建议不使用';不匹配切入点_Java_Spring_Spring Boot_Aop_Aspectj - Fatal编程技术网

Java Spring AOP AspectJ试图建议不使用';不匹配切入点

Java Spring AOP AspectJ试图建议不使用';不匹配切入点,java,spring,spring-boot,aop,aspectj,Java,Spring,Spring Boot,Aop,Aspectj,我在一个项目中设置了AOP日志,但在另一个项目中却不起作用 从build.gradle: 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

我在一个项目中设置了AOP日志,但在另一个项目中却不起作用

从build.gradle:

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”切入点吗

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

好:

这些方面位于com.company.app.logging包中


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

方面子类化有什么意义?如果要对多个连接点应用相同的处理方法,只需创建一个
private
方法。当然,这可能是不同的结构。你知道为什么weaver在随机类中寻找“toLog”切入点吗?我的评论不仅仅是关于代码结构。您已经将基类以及子类设置为方面,但只有子类具有连接点。你的设计很可能是这种奇怪行为的原因。这在另一个项目中起作用。我确实尝试过将所有注释移动到派生类。没有运气;同样的行为。好的,贴一个,我来看看。就目前情况而言,您没有显示您希望学习的课程和不希望学习的课程。根据您关于“相同”设置在其他地方适用的评论,可能还有其他变量。我们需要看到重现问题的代码。
@Configuration
public class LoggerConfig {

    @Bean
    public SDKProfiler sdkProfiler() { return new SDKProfiler(); }
}
@Configuration
@ComponentScan("com.company.app.logging")
public class LoggerConfig {
}