Spring AOP pointcut не срабатывает

По какой-то причине мой pointcut не срабатывает. Примечание. Я использую аспекты весеннего стиля, а не стиль AspectJ.

Фрагмент XML

<bean id="authenticationAspect" class="ssel.banking.security.AuthenticationAspect" />

<aop:config>
    <aop:aspect ref="authenticationAspect">
        <aop:pointcut id="interceptControllerInvocation"
            expression="execution(* org.springframework.web.servlet.mvc.Controller+.handleRequestInternal(javax.servlet.http.HttpServletRequest, ..)) 
                                      and args(request, ..) 
                                      and target(controller)"/>

        <aop:around pointcut-ref="interceptControllerInvocation" 
            method="authenticationAdvice"/>
    </aop:aspect>
</aop:config>

Класс, определенный моим bean-компонентом

import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class AuthenticationAspect {

    public ModelAndView authenticationAdvice(ProceedingJoinPoint pjp, HttpServletRequest request, Controller controller) throws Throwable{

        String URL = request.getRequestURL().toString();
        String viewName = URL.substring(0, URL.length() - 4);
        System.out.println(viewName);

        return (ModelAndView) pjp.proceed();
    }

}

Я что-то упускаю?


person voluminat0    schedule 13.11.2014    source источник
comment
В дополнение к тому, что сказал Зоран Регварт, если handleRequestInternal не вызывается через границы bean-компонента (т. е. он вызывается из другого метода в bean-компоненте, например handleRequest, он не будет проксироваться, потому что это реентерабельный вызов.   -  person mkobit    schedule 20.11.2014


Ответы (1)


Скорее всего, вызов метода handleRequestInternal выполняется не через границы компонента, а из самого компонента. Я предполагаю, что вы используете AbstractController в качестве базы для своих контроллеров, и вы можете видеть, что метод handleRequest вызывает handleRequestInternal напрямую.

Вы не можете использовать этот код без использования компилятора аспектов и изменения байт-кода класса. И вы, вероятно, не хотите делать это с кодом библиотеки (AbstractController).

person Zoran Regvart    schedule 13.11.2014