1

我从一个关于需要帮助创建一个利用方法注释中的值的特定切入点的原始问题开始

我决定我想问另一个问题来改变我正在采取的方法。我有一个方法(导航),它在该方法内部调用了另一个方法,我想获得@Around 建议。

@RequestMapping(method = RequestMethod.GET)
public String navigation(ModelMap model) {
    ...        
            // Call Auto Handling
            logger.info("Call AutoHandling");
            this.processAutoHandling(callSession, FunctionalArea.PRE_MAIN_MENU);
        }
        ...

    return forward(returnView);
}

这是否可能,因为如果该方法在同一个类中,我似乎无法让它工作。

如果它不在对象本身上,则此工作:

@Around("execution(* *.processAutoHandling(..)) &&" +
        "args(callSession, functionalArea) && " +
        "args(functionalArea) && " +
        "target(bean)"
)
public Object processAutoHandlingCall2(ProceedingJoinPoint jp,
                                      CallSession callSession,
                                      FunctionalArea functionalArea,
                                      Object bean)
        throws Throwable {
    logger.debug("processAutoHandleCall");
    return jp.proceed();
}

在我的控制器中使用此调用:

autoHandlingComponent.processAutoHandling(callSession, FunctionalArea.PRE_MAIN_MENU);

代替

this.processAutoHandling(callSession, FunctionalArea.PRE_MAIN_MENU);
4

1 回答 1

1

看来您正在使用 Spring 的基于代理的 AOP。如果是这样,这是一个已知的限制。有关更多详细信息,请参阅从 Spring 文档中了解 AOP 代理。您有两种方法可以解决此问题:

  1. 使用AopContext.currentProxy()文档中概述的方法。我不鼓励这种方法,因为您的代码现在将非常明确地绑定到 Spring AOP。
  2. 使用 AspectJ 的字节码编织。由于它不涉及代理,因此您不会遇到“this”指向原始对象的问题,并且代理仅对外部对象透明可用。
于 2011-01-22T20:02:45.383 回答