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>

Клас, определен от моя компонент

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