maven - Spring AOP - AspectJ 错误 : ambiguous binding of parameter(s) session across '||' in pointcut

标签 maven aspectj spring-aop

当我从命令行或 Eclipse 运行 mvn package 时,出现此错误。

奇怪的是,如果我运行 mvn package 3-4 次,则不再显示错误并且构建成功完成!另外,在 Eclipse 中,定义切入点的文件中(在包资源管理器中)有一个红色的“x”,但是当我打开文件时没有错误。切入点。 '||' 所在的两个切入点使用的是:

@Pointcut("((execution(gr.diassa.dslibweb.data.dto.GenericGrid gr.diassa.dslibweb.controller.*.*(..)) && args(session,..)) || (execution(gr.diassa.dslibweb.data.dto.GenericGrid gr.diassa.dslibweb.controller.*.*(..)) && args(..,session))) && excludeInitControllerMethods()")
public void controllerActionForMethodsThatReturnJsonString(HttpSession session) {

}

@Pointcut("((execution(org.springframework.web.servlet.ModelAndView gr.diassa.dslibweb.controller.*.*(..)) && args(session,..)) || (execution(org.springframework.web.servlet.ModelAndView gr.diassa.dslibweb.controller.*.*(..)) && args(..,session))) && excludeInitControllerMethods()")
public void controllerActionForMethodsThatReturnModelAndView(HttpSession session) {

}

我在任何地方都没有找到类似的东西,以前有人处理过这个吗?

最佳答案

这既是编译器指出的一个有效问题,也是从实际角度来看AspectJ的缺点。

需要注意的一点是:您不仅使用切入点来绑定(bind)通知,而且同时尝试从匹配的切入点中获取一些参数值。现在的问题是您正在定义两个替代方案(使用 ||)——不幸的是,这两种方案都可能适用。这对于匹配和定义建议来说不是问题。但由于您想要选择一个参数值,AspectJ 不知道当两个分支都有效时要做什么。

在您的示例中,可能有一个方法,该方法在参数列表的开头和结尾处采用两个不同的 session 参数。这样的方法将匹配切入点的两个替代分支。在这种情况下,AspectJ 假定返回哪个 session ?

虽然所有这些在逻辑上都是理智和正确的,但从实际的角度来看,这通常会被证明是一个缺点。

  • 通常——当你开始编写这样的切入点时很常见——你只是碰巧知道你想要的特定对象总是相同的,或者至少差异并不重要。或者您假设您从第一个适用的分支(“短路评估”)获得匹配,并且不关心进一步的匹配
  • 在我遇到的所有情况下,AspectJ 无法找出两个分支是不相交的,即使在可以静态导出的情况下也是如此。
  • 另请参阅此错误 https://bugs.eclipse.org/bugs/show_bug.cgi?id=121805 (2005 年报道,2014 年重新开放)。看起来实现这些东西很棘手并且很难正确执行。这个错误也可能解释了为什么这个问题没有被一致地检测到(正如它应该的那样)

因此,唯一的补救措施是将切入点拆分为每个分支的不同切入点,并为每个分支编写单独的建议。。通常,您希望将所有这些建议委托(delegate)给一个通用的实现方法。丑陋,但可以让你在实践中解决这个问题

关于maven - Spring AOP - AspectJ 错误 : ambiguous binding of parameter(s) session across '||' in pointcut,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8501555/

相关文章:

maven - 让 IntelliJ IDEA 对 maven 项目使用不同的 pom 文件

java - Aspectj 切入点表达式不适用于单个类中的一种方法,但适用于另一种方法

java - AspectJ:自定义 *.aj 文件被忽略

java - 通过使用AspectJ,如何获取由 'Object'关键字创建的 'new'引用?

java - 从回调内部重新抛出 Throwable

Spring AOP : advice is not triggered

java - 在新线程中调用连接点时 Spring Aspect 失败

maven - 如何在Maven中更改$ {project.build.outputDirectory}的默认值?

eclipse - 传输依赖失败,已缓存在本地存储库中

Maven 依赖项 : exclude one class