Использование пользовательской аннотации для метода контроллера Spring MVC от перехватчика - PullRequest
4 голосов
/ 24 июня 2011

У меня есть пользовательская аннотация, с помощью которой я аннотировал метод в моем контроллере вместе с @ ReqestMapping.

Цель состоит в том, чтобы использовать значения, установленные в пользовательской аннотации из HandlerInterceptor, для выполнения задачи.

У меня есть перехватчик (HandlerInterceptorAdaptor), и он выполняется.Если я установлю точку останова в моем конкретном Перехватчике, я смогу проверить HttpServletRequest, HttpServletResponse и объекты-обработчики.Тем не менее, я не вижу, как 1, получить метод, к которому запрос пытается получить доступ 2, получить аннотации для этого метода и 3, конечно, получить значения, установленные аннотацией.

Может кто-нибудь указатьмне хорошую документацию для этого?

Пожалуйста и спасибо.

Ответы [ 6 ]

4 голосов
/ 24 июня 2011

в Spring 3.1 мы ввели абстракцию HandlerMethod для представления того конкретного метода контроллера, который будет обрабатывать запрос.Для этого есть HandlerMapping и HandlerAdapter.Вы можете прочитать об этом более подробно в моем блоге после релиза M2.

https://spring.io/blog/2011/06/13/spring-3-1-m2-spring-mvc-enhancements/

Пружина 3.1 еще не выпущена GA.Конечно, это доступно как выпускной этап, а также как ночной снимок.В любом случае, это то, что вы должны принять во внимание и, следовательно, стоит упомянуть.

4 голосов
/ 24 июня 2011

АОП будет хорошо для вас.Вы должны быть в состоянии написать рекомендацию, которая выполняет вашу задачу, с определением точки соединения, которая фиксирует контекст вызываемого контроллера - любые ваши пользовательские аннотации вместе с переданными параметрами.

1 голос
/ 24 июня 2011

Вы не можете сказать, какой метод в обработчике он будет вызывать изнутри перехватчиком, поскольку HandlerMapping не знает.Эта логика скрыта внутри AnnotationMethodHandlerAdapter, у которого нет точек расширения.Вам нужно будет реализовать способ выяснить, какой метод он будет вызывать, основываясь на структуре вашего контроллера, если вам нужна эта информация в перехватчике.

1 голос
/ 24 июня 2011

Пожалуйста, опубликуйте примеры кода, чтобы мы могли лучше понять, какую проблему вы пытаетесь решить.

Учитывая то, что вы описали до сих пор, я не думаю, что это то, для чего предназначен HandlerInterceptor.Предполагается, что он будет использоваться для сквозных задач, но по описанию вашей проблемы трудно сказать, что такое сквозная обработка.Если вы хотите связать логику с контроллером, то почему бы не изменить контроллер напрямую?Похоже, что модификация в любом случае тесно связана с контроллером, но без подробностей сложно сказать.Тем не менее, вот связанный вопрос и ответы: HandlerMethod с заданным HttpRequest? .

Использование AOP поможет вам в этом - по крайней мере, вы узнаете больше о том, какой контроллерметод вызывается.Дополнительная информация: Spring AOP pointcut, соответствующий аннотации на интерфейсе

0 голосов
/ 03 декабря 2018

Я искал такое же решение и нашел туториал https://saarthakvats.wordpress.com/2016/05/29/spring-4-mvc-request-interceptor-and-custom-method-argument-annotation-resolver/comment-page-1/#comment-9, где они создают обработчик и аннотацию для доставки идентификатора пользователя после того, как обработчик проверил, был ли токен в методе конечной точки в порядке.С помощью небольшого изменения мы можем превратить его в аннотацию, чтобы определить, является ли эта конечная точка общедоступной или нуждается в роли пользователя.

Другой пример, который ближе к тому, что нам нужно: https://www.future -processing.pl / блог / изучение-весна-загрузка и пружинная-безопасность на заказ на основе маркеры-аутентификация из-Rest-сервисы с пружиной-безопасность и ущемление из-весны-Java-конфигурация-и-весна-интеграционное тестирование /

0 голосов
/ 24 июня 2011

Вы смотрели на отражение?

http://java.sun.com/developer/technicalArticles/ALT/Reflection/

например

    Class classVar = Class.forName("java.lang.String");

  // getDeclaredFields() returns all the constructors
  Constructor cnstArray[] = classVar.getConstructors();

  // getFields() returns the declared fields 
  Field fldArray[] = classVar.getDeclaredFields();

  // getMethods() returns the declared methods of the class.
  Method mtdArray[] = classVar.getMethods();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...