【Exception】Spring AOP 报错: error at ::0 can‘t find referenced pointcut point

本文针对 Spring AOP 切面配置时出现的 errorat::0can'tfindreferencedpointcutpoint 错误进行了详细的分析与解决。问题出现在连接切点方法名称与切点不匹配上。

【Exception】Spring AOP 报错: error at ::0 can't find referenced pointcut point

 

一、问题描述

1、在使用Spring配置AOP 切面时,遇到一个报错问题:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0': Initialization of bean failed; nested exception is java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut point

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547)

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)

at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302)

at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)

at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)

at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)

at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)

... 63 more

Caused by: java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut point

at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301)

 

 

二、问题解决

1、查了不少答案,说是jar版本不兼容问题导致的;本项目环境概况: JDK1.8 ; Spring 4.3+ ; aspectjrt-1.7.4.jar ; aspectjweaver-1.7.4.jar ; 基本可以排除jar包问题。

2、问题发现:配置环绕的时候,连接切点方法写错了

 

 

而且还写成了 point , 造成了问题难以定位!

 

 

3、问题解决: 连接切点的方法名要和正确的切点保持一致,才能正确实现AOP切面配置。

 

 

 

遇到类似问题的朋友,可以按照这个思路排查试试。

 

 

 

<think>首先,用户的问题是关于解决Java中出现的错误:"java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut logger"。用户提供了几个引用,我需要参考这些引用,但关键是用户的需求。 从引用中: - 引用[1]提到错误有两种可能:JDK版本不兼容或pointcut拼写错误。 - 引用[2]展示了一个@AfterReturning注解的例子,其中有拼写错误("poincut"应该是"pointcut")。 - 引用[3]显示了一个@Around注解的例子,使用了"costTime()",可能与pointcut定义相关。 用户的具体错误是"can't find referenced pointcut logger",这表明pointcut名称"logger"没有被定义或拼写错误。 我的回答需要: - 使用中文回答。 - 结构清晰,帮助用户逐步解决问题。 - 引用相关段落时添加引用标识。 - 生成相关问题。 - 确保LaTeX语法正确(但由于这是一个编程相关问题,可能不需要复杂的数学表达式)。 步骤: 1. **理解错误**:错误表明Spring AOP或AspectJ无法找到名为"logger"的pointcut表达式。pointcut是定义在Aspect类中的方法。 2. **可能原因**: - Pointcut定义缺失或拼写错误。 - JDK版本问题(如引用[1]所述)。 - 其他配置问题。 3. **解决方案**: - 检查pointcut定义是否正确。 - 确保pointcut名称匹配。 - 验证JDK版本兼容性。 - 示例代码修正。 回答结构: - **步骤1: 确认pointcut定义**:用户需要在Aspect类中定义pointcut。例如:`@Pointcut("execution(* com.example.*.*(..))") public void logger() {}` - **步骤2: 检查引用拼写**:在通知(如@Before, @Around)中引用的pointcut名称必须与定义一致。引用[2]中"poincut"是拼写错误,应改为"pointcut"。 - **步骤3: JDK兼容性**:如果使用旧JDK,尝试升级或降级以兼容AOP库。 - **步骤4: 其他检查**:确保Aspect类被Spring管理,使用@Component或@Aspect注解。 - **生成相关问题**:在回答结束时添加相关问题。 确保引用: - 当提及引用时,自然地添加[^1], [^2]等。例如,根据引用[1],错误可能由于JDK版本或拼写错误[^1]。 最终回答大纲: 1. 介绍错误原因。 2. 逐步解决方案。 3. 示例代码。 4. 相关问题。 </think>### 解决Java中"java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut logger"错误的方法 这个错误通常发生在Spring AOP框架中,表明在通知(如@Around、@AfterReturning)中引用的pointcut表达式(这里是"logger")无法被正确解析。主要原因是pointcut定义缺失、拼写错误或配置问题。以下是基于您提供的引用和常见实践总结的**逐步解决方法**: #### 步骤1: 检查pointcut定义是否正确 (最常见原因) - **问题**:在Aspect类中,名为"logger"的pointcut方法可能未定义、拼写错误,或签名不匹配。 - **解决方案**: - 确保在Aspect类中定义了一个有效的pointcut方法。示例: ```java @Aspect @Component public class LoggingAspect { // 定义名为"logger"的pointcut,确保名称匹配 @Pointcut("execution(* com.example.service.*.*(..))") // 修改为您实际的方法路径 public void logger() {} // 方法名必须与通知中引用的"logger"一致 } ``` - **关键检查点**: - Pointcut方法名(如`logger()`)必须与通知注解(如@Around)中引用的名称完全一致,包括大小写。 - 如果通知中写的是`@Around("logger()")`,但定义中是`@Pointcut("...") public void log() {}`,会报此错误。 - 引用[2]中展示了拼写错误("poincut" vs "pointcut"),类似错误如将"logger"写成"loger"也会导致此问题[^2]。 #### 步骤2: 验证通知注解的引用格式 - **问题**:在通知方法中引用pointcut时,语法错误或参数不匹配可能导致无法识别。 - **解决方案**: - 修正通知注解中的pointcut引用。示例: ```java @Around("logger()") // 正确引用定义的pointcut方法名 public Object logMethod(ProceedingJoinPoint joinPoint) throws Throwable { // 日志逻辑 return joinPoint.proceed(); } ``` - **避免常见错误**: - 确保引用格式是`pointcut名称()`,而非直接写表达式(除非是内联pointcut)。 - 引用[3]中的`@Around("costTime()")`假设了pointcut已定义,类似地,您的代码需检查"logger"是否正确定义[^3]。 - 如果使用参数(如returning),确保类型匹配(引用[2]中的`returning = "object"`)。 #### 步骤3: 检查JDK版本兼容性 - **问题**:JDK版本与Spring AOP或AspectJ库不兼容可能引发此错误(引用[1]提到的一种可能原因)。 - **解决方案**: - **升级/降级JDK**:建议使用JDK 8或JDK 11(最稳定)。如果使用JDK 17+,请确保Spring Boot版本≥2.7.x。 - **验证依赖**:在`pom.xml`中确认AOP库版本: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> <version>2.7.0</version> <!-- 兼容JDK 11+ --> </dependency> ``` - 如果错误在切换JDK后出现,优先排查此问题[^1]。 #### 步骤4: 其他配置排查 - **确保Aspect类被Spring管理**: - 添加`@Component`或`@Aspect`注解到Aspect类上,并检查包扫描是否包含该类(例如,Spring Boot中`@SpringBootApplication`默认扫描主类所在包)。 - **检查项目结构**: - Pointcut定义和通知方法必须在同一个类或可访问的类中。 - 避免多个Aspect类定义同名pointcut导致冲突。 - **启用AOP代理**:在Spring Boot中,默认启用;若非Spring Boot项目,需在配置中添加`@EnableAspectJAutoProxy`。 #### 总结 通过以上步骤,90%的此类错误可解决:优先检查pointcut定义和引用拼写(步骤1-2),其次排查JDK版本(步骤3)。如果问题依旧,提供更多代码片段以便进一步调试。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值