Нужна помощь в создании определенного pointcut, который использует значение из аннотации метода - PullRequest
0 голосов
/ 21 января 2011

У меня есть следующий метод

    @AutoHandling(slot = FunctionalArea.PRE_MAIN_MENU)
    @RequestMapping(method = RequestMethod.GET)
    public String navigation(ModelMap model) {
        logger.debug("navigation");
        ...

            //First time to the Main Menu and ID-Level is ID-1 or greater
            if (!callSession.getCallFlowData().isMainMenuPlayed()
                    && callSession.getCallFlowData().getIdLevel() >= 1) {
                // Call Auto Handling                    
                logger.info("Call AutoHandling");
                autoHandlingComponent.processAutoHandling();
            }
        ...

        return forward(returnView);
    }

В основном, что я хочу сделать, это иметь pointcut на processAutoHandling () Но в @After мне нужно использовать slot () для @ AutoHandling

Я пробовал это, но это не называется

@Pointcut("execution(* *.processAutoHandling())")
public void processAutoHandleCall() {
    logger.debug("processAutoHandleCall");
}

@Around("processAutoHandleCall() &&" +
        "@annotation(autoHandling) &&" +
        "target(bean) "
)
public Object processAutoHandlingCall(ProceedingJoinPoint jp,
                                      AutoHandling autoHandling,
                                      Object bean)
        throws Throwable {
         ...

Ответы [ 2 ]

2 голосов
/ 21 января 2011

Вы можете использовать шаблон проектирования червоточины для этого.Я иллюстрирую использование подхода и синтаксиса на основе байт-кода AspectJ, но вы должны иметь возможность получить тот же эффект, используя явный ThreadLocal, если вы используете AOP на основе прокси Spring.

pointcut navigation(AutoHandling handling) : execution(* navigation(..)) 
                                             && @annotation(handling);

// Collect whatever other context you need
pointcut processAutoHandleCall() : execution(* *.processAutoHandling());

pointcut wormhole(AutoHandling handling) : processAutoHandleCall() 
                                           && cflow(navigation(handling));

after(AutoHandling handling) : wormhole(hanlding) {
   ... you advice code
   ... access the slot using handling.slot()
}
0 голосов
/ 21 января 2011

а) Это не может работать, вы пытаетесь сопоставить две разные вещи:

@Around("processAutoHandleCall() &&" +
        "@annotation(autoHandling) &&" +
        "target(bean) "
)

processHandleCall() соответствует внутреннему выполнению метода autoHandlingComponent.processAutoHandling(), а @annotation(autoHandling) соответствует внешнему выполнению метода navigation(ModelMap model)

б) поскольку вы, очевидно, пытаетесь посоветовать контроллеру, есть несколько предостережений:

  • если вы используете proxy-target-class=true все должно работать как есть, просто убедитесь, что у вас нет окончательных методов
  • в противном случае все ваши методы контроллера должны поддерживаться интерфейсом, а аннотации @RequestMapping и т. Д. Должны быть на интерфейсе, а не в классе реализации, как описано в этом разделе справочных документов Spring MVC.
...