error at ::0 can't find referenced pointcut和error at ::0 formal unbound in point

本文解决Spring AOP配置中的两个错误:无法找到引用切入点和形式未绑定于切入点。通过更新aspectjweaver.jar版本解决第一个问题;第二个问题通过移除通知方法中的参数解决。并强调了正确使用JoinPoint的重要性。
在使用注解配置Spring AOP过程中发现两个error:
1. error at ::0 can't find referenced pointcut
2. error at ::0 formal unbound in point

对于第1个错误,网上的说法是,如果使用的spring 2.0的版本中的的aspectjrt.jar和jdk6不兼容。
说下我的环境,JDK7 + Spring 3.6.6,因此不是aspectjrt.jar问题(何以如此确定?请看下文)。最初我也尝试使用不同版本的aspectjrt.jar文件,但都不起作用。于是我怀疑可能是aspectjweaver.jar的问题,因为使用的版本较低(1.5的)。
于是下载了新版本aspectjweaver-1.6.12替换掉旧的,第1个错误就解决了,而且classpath中没包含aspectjrt.jar。

再来说下第2个错误,贴下我的代码:
Java代码 收藏代码
@After("testBeanExecution()")
public void afterCall(Joinpoint jp) {
System.out.println("After");
}
修改为:
Java代码 收藏代码
@After("testBeanExecution()")
public void afterCall() {
System.out.println("After");
}
这样第2个错误就没了。也就是说去掉afterCall方法中的参数就可以了。

事实上这种解决办法是不对的,原因是Spring的AOP没那么残废,而是我们使用的不对。
(1)如果要访问JoinPoint,那么我们只需要将org.aspectj.lang.JoinPoint作为通知(advice,如afterCall)中的第一个参数就可以了。那么为什么上面的代码会出错呢。很简单,请仔细看其中的参数,我使用的是org.aopalliance.intercept.Joinpoint,来自aopalliance.jar包。这是使用IDE的自动补全功能时很容易犯的一个错误。所以请确认你写的是否是JoinPoint。
(2)如果要给通知(advice)传递参数,请使用args参数,如下:
Java代码 收藏代码
@Before("com.xyz.myapp.SystemArchitecture.dataAccessOperation() &&" +
"args(account,..)")
public void validateAccount(Account account) {
// ...
}


感谢 http://jasonhan-sh-hotmail-com.iteye.com/blog/1486737
<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)。如果问题依旧,提供更多代码片段以便进一步调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值