Нужна помощь в создании определенного pointcut внутри метода - PullRequest
1 голос
/ 22 января 2011

Я начал с исходного вопроса по Нужна помощь в создании определенного pointcut, который использует значение из аннотации метода

Я решил, что хочу задать другой вопрос, чтобы изменить подход, которым я былс.У меня есть метод ( navigation ), который вызывает внутри этого метода вызов другого метода, который я хотел бы получить @Around advice.

@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);

1 Ответ

1 голос
/ 22 января 2011

Похоже, вы используете AOP на основе прокси Spring.Если это так, это известное ограничение.См. Общие сведения о прокси-серверах AOP в документации Spring для получения дополнительной информации.У вас есть два способа решения этой проблемы:

  1. Используйте подход AopContext.currentProxy(), описанный в документации.Я не буду поощрять этот подход, поскольку ваш код теперь будет явно привязан к Spring AOP.
  2. Используйте переплетение байт-кода AspectJ.Поскольку с ним не связан ни один прокси-сервер, у вас не возникнет проблема с указанием «this» на исходный объект, а прокси будет прозрачно доступен только для внешних объектов.
...