AspectJ表达式在切入点错误中提供正式的未绑定

时间:2012-09-04 06:50:15

标签: java spring spring-aop pointcut

我有 aspectJ 表达式:

@Pointcut("within(com.param.cpms.dao.impl.ProjectMetaDaoImpl)")
public void daoExceptionHandle() {

}

Spring 3.0 启动时,我收到以下错误

nested exception is java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut

10 个答案:

答案 0 :(得分:23)

可能问题不在于您的切入点,而在于使用该切入点并使用切入点中不存在的参数的建议。只需从建议中删除参数(好吧,或将其添加到切入点)。

答案 1 :(得分:6)

该帖子相当陈旧,但为了完整起见,我提出另一个原因,如果你使用@Around建议。

根据Spring AspectJ documentation,建议的第一个参数必须是ProceedingJoinPoint。如果它丢失了,您将收到此异常消息。可悲的是,这个例外并没有指出错误的建议,所以解决这个错误就是一次又一次。

答案 2 :(得分:5)

由于错误导入了类,我收到了此错误。我应该导入导入org.aspectj.lang.JoinPoint类,而是从其他包导入一些其他Joinpoint类。

答案 3 :(得分:4)

是Joinpoint(" p小写)

org.aopalliance.intercept.Joinpoint;

更改为JointPoint(" P大写)

org.aspectj.lang.JoinPoint; 

答案 4 :(得分:2)

我也有这个问题,在我的情况下,这是一个错误的导入:org.aopalliance.intercept.Joinpoint;

需要:org.aspectj.lang.JoinPoint;

答案 5 :(得分:2)

有时候原因可能是这样。

 public void afterReturning(JoinPoint joinPoint, Object result)

只需如下删除Object result,它对我有用。

public void afterReturning(JoinPoint joinPoint)

答案 6 :(得分:1)

如果您使用的是基于XML的配置,并且您的配置是这样的:

<aop:config>
<aop:aspect ref="bAdvice">
    <aop:pointcut id="displayPointcut" expression="execution(* com.example.demo.BusinessClass.display())"/>
    <aop:before method="before" pointcut-ref="displayPointcut" />
</aop:aspect>
</aop:config>

然后在2个场景中,您收到错误:

  1. 如果在切入点表达式中,方法,即我们的情况下的display()已经定义了没有任何参数,并且在实际的类方法中有一些参数。
  2. 如果在建议之前,即aop:之前,方法=&#34;之前&#34;已经定义了没有arg-names和实际的建议类,方法&#34;之前&#34;有一些参数。
  3. 最终,当XML中定义的方法参数与实际方法不匹配时,将出现此错误。

答案 7 :(得分:1)

这不是你的答案,但可能对你有所帮助。

Spring AOP Tutorial您可以参考本教程

@Before("execution(* com.de.controller..*(..))")
public void beforeLoggerAdvice(JoinPoint joinPoint, WebRequest request) {
    DeUtil.looger.info("--working");
}

我得到了相同的例外但由于 WebRequest ,我删除了它并使用了替代

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();

答案 8 :(得分:0)

AOP中的两个共振点也会发生正式的未约束切入点异常。

原因1:如果在返回建议后中没有返回声明

用于基于XML的实现

<aop:aspect id="myaspect" ref="trackAspect">
<aop:pointcut id="pointCutAfterReturning" expression="execution(* com.springlearn.Operation.*(..))" />
<aop:after-returning method="myAdvice"  returning="result" pointcut-ref="pointCutAfterReturning"/>  //Make sure returning result is added
</aop:aspect>

用于基于注释的实现

@AfterReturning(  
              pointcut = "execution(* Operation.*(..))",  
              returning= "result") //Make sure returning result is added

原因2:如果没有在提交建议后扔出

用于基于XML的实现

<aop:aspect id="myaspect" ref="trackAspect" >  
     <!-- @AfterThrowing -->  
     <aop:pointcut id="pointCutAfterThrowing"    expression="execution(* com.javatpoint.Operation.*(..))" />  
     <aop:after-throwing method="myadvice" throwing="error" pointcut-ref="pointCutAfterThrowing" />  //Make sure throwing error is added
  </aop:aspect> 

用于基于注释的实现

@AfterThrowing(  
              pointcut = "execution(* Operation.*(..))",  
              throwing= "error")  //Make sure throwing error is added

答案 9 :(得分:0)

我遇到了同样的错误,在我的场景中,我使用的是两个方法参数

public void methodName(JoinPoint joinPoint ,HttpServletRequest request) throws

我的注释就像

@Before("execution(public * com.java.controller.*Controller.*(..))")

作为我添加的解决方案

  

args(request,..)

@Before("execution(public * com.java.controller.*Controller.*(..)) && args(request,..)")