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