当我从命令行或 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/