2013-09-26 3 views
0

У меня есть метод @Aspect и @Pointcut, аннотированный для запуска @ Перед вызовом метода @Controller, он кажется совпадающим (поскольку я не получаю никаких ошибок), но это не уволив мой метод консультаций вообще. Я изменил свой pointcut для целей тестирования как можно более конкретный, и я не получаю никаких ошибок привязки во время запуска приложения.Spring AOP @Pointcut not triggering @Before method

Вот мой метод контроллера (класс является com.xyzMyController):

@RequestMapping(method = RequestMethod.POST, produces = "application/json", consumes = "application/json") 
@ResponseBody 
public SubmissionResponse submitMethod(@Valid @RequestBody final SubmissionRequest request, HttpServletRequest httpRequest, BindingResult result) 
{ 
    if (result.hasErrors()) { throw new BadRequestException(result); } 

    // ... do stuff ... 
} 

Вот класс Формат:

@Aspect 
@Component 
public class RequestValidatingAspect 
{ 
    private static final Logger LOGGER = Logger.getLogger(RequestValidatingAspect.class); 

    @Inject 
    private ClientService clientService; 

    @Inject 
    private AccountService accountService; 

    @Pointcut("execution(* com.x.y.z.MyController.submitMethod(*.SubmissionRequest,*.HttpServletRequest,*.BindingResult)) && args(request, httpRequest, result)") 
    private void requestValidation(SubmissionRequest request, HttpServletRequest httpRequest, BindingResult result) {} 

    @Before("requestValidation(request,httpRequest,result)")  
    public void theAdvice(SubmissionRequest request, HttpServletRequest httpRequest, BindingResult result) throws Throwable 
    { 
     System.out.println("Before - The Advice"); 
     LOGGER.info("Entering The Advice!"); 

     if(result.hasErrors()){ throw new BadRequestException(result); } 
     // ... do stuff ... 

     LOGGER.info("Exiting - The Advice!"); 
     return; 
    } 
} 
+0

Можем ли мы видеть ваш контекст? –

ответ

0

Оказывается, что линия @Pointcut не совсем верный. Изменение:

.. submitMethod(*.SubmissionRequest,*.HttpServletRequest,*.BindingResult) ..

к submitMethod(..) или используя полное имя класса для каждого из трех объектов с одинаковым args фильтром позволило совет, чтобы зафиксировать на различных методах я хотел консультировали. Я завелся изменения моего подхода немного, хотя и создал пользовательскую аннотацию непосредственно сигнализировать, какие методы я хотел консультировал и завелся с этими конечным срезом точками:

@Pointcut("@annotation(com.x.y.z.annotation.SpecificTypeOfRequestValidation) && args(request, httpRequest, result)")

0

Если вы используете Spring 4, то все, что можно используйте примечание @ControllerAdvice, чтобы централизовать все проверки запроса, которые выглядят более полезными с точки зрения обслуживания.

Смежные вопросы