2014-07-07 3 views
6

Я разрабатываю веб-сервис REST с Spring MVC, и я внедрил пользовательскую аннотацию, чтобы аннотировать методы контроллера с ней. Эта аннотация может включать выражение SpEL, которое я должен оценить с учетом значений аргументов контроллера. Итак, моя идея заключается в реализации перехватчика Spring MVC для этого, но параметр HandlerMethod в методе preHandle - это всего лишь способ идентифицировать метод и не обеспечивает доступ к значениям аргумента метода контроллера. Таким образом, единственный подход, который я могу придумать, - разработать аспект AOP Spring и перехватить все вызовы аннотированных методов. Кстати, мне нужен доступ к запросу, поэтому, если я иду по пути AOP, все аннотированные методы должны включать аргумент с запросом.Доступ к значениям параметра метода контроллера из перехватчика Spring MVC

Итак, мой вопрос: есть ли способ получить доступ к значениям аргумента метода из перехватчика Spring MVC или мне нужно перейти к Spring AOP ?.

Заранее спасибо.

+0

я мог бы быть недопонимание, что вы пытаетесь сделать, но Безразлично» t 'HandlerMethod.getMethodParameters()' возвращает необходимую информацию? – geoand

+0

@geoand from MethodParameter javadoc «Класс помощника, который инкапсулирует спецификацию параметра метода» –

+0

Вы имеете в виду, что вам нужны фактические аргументы, которые будут переданы методу? – geoand

ответ

5

Вы не можете использовать параметр метода управления в preHandle методе перехватчика, потому что в момент вызова его, параметры контроллера не были построены (кроме запроса и ответа).

Таким образом, вам придется пройти путь AOP (не забудьте реализовать метод в ваших контроллерах ...), как описано в ответе JavaBond. Но благодаря Spring Framework вы можете избежать того, что все аннотированные методы должны включать аргумент с запросом. RequestContextHolder.getRequestAttributes() дает вам объект RequestAttributes. Если вы знаете, что ваш запрос являетсяHttpServletRequest, вы можете привести его к ServletRequestAttributes, а затем получить доступ к родной запрос через getRequest() метод:

RequestAttributes reqAttr = RequestContextHolder.getRequestAttributes(); 
HttpServletRequest req = ((ServletRequestAttributes) reqAttr).getRequest(); 
+0

В приведенном выше коде есть небольшая синтаксическая ошибка. Должно быть: 'code RequestAttributes reqAttr = RequestContextHolder.getRequestAttributes(); HttpServletRequest req = ((ServletRequestAttributes) reqAttr) .getRequest(); ' –

3

Вы должны пройти путь АОП.

Напишите комментарий Around к вашей пользовательской аннотации. Совет вокруг должен иметь аргумент ProceedingJoinPoint. С помощью этого вы можете получить аннотированные методы аргументов значения с помощью советов proceedingJoinPoint.getArgs()

Образца показано ниже

@Around("@annotation(yourCustomAnnotation)") 
public Object arooundAdvice(ProceedingJoinPoint joinpoint, 
     YourCustomAnnotation yourCustomAnnotation) throws Throwable { 

    Object args[] = joinpoint.getArgs(); 
    // iterate over the args[] array to get the annotated method arguments 
    return joinpoint.proceed(); 
} 
+0

Как я уже сказал в своем вопросе, я не могу получить доступ к фактическим аргументам метода контроллера от Interceptor. Насколько я знаю, HandlerMethod - это всего лишь способ идентифицировать метод, который будет вызываться. –

+0

@ JuanCarlosGonzález см. Мой отредактированный ответ.надеюсь, это поможет –

+0

спасибо за ответы. Это один из вариантов, о котором я думал. Идя по пути AOP, я должен включить запрос ко всем аннотированным методам. Я думал, что перехватчик был более естественным способом. –

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