Программно вызвать @Controller - PullRequest
4 голосов
/ 25 августа 2009

Я перевожу код, который использовал реализации контроллера Spring MVC для использования стереотипа аннотации @Controller. Все идет хорошо, за исключением одного вопроса:

Учитывая запрос / ответ, как мне программно обрабатывать запросы для контроллеров на основе аннотаций?

Ранее (независимо от реализации) мне удалось позвонить:

controller.handleRequest(request, response)

Что эквивалентно аннотациям? Я предполагал, что будет некоторый (возможно, статический?) Служебный класс в духе:

SpringAnnotationBasedControllerUtils.handleRequest(<? extends @Controller> handlerObject, HttpServletRequest request, HttpServletResponse response);

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

Есть предложения?

(Пожалуйста, не комментируйте, почему это плохая идея или она должна быть ненужной при «хорошем» дизайне и т. Д. Этот код находится на обслуживании и должен быть настолько неинвазивным, насколько это возможно, поэтому полная перезапись не возможна на этот раз.)

Спасибо!

Ответы [ 3 ]

3 голосов
/ 25 августа 2009

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

Или вы говорите, что хотите заново изобрести механизм, с помощью которого Spring отображает запросы на аннотированные контроллеры? Если это так, взгляните на источник классов Spring * AnnotationMethodHandlerAdapter и DefaultAnnotationHandlerMapping. Хотя это сложно - аннотированные контроллеры облегчают написание контроллеров, но лежащий в их основе механизм неприятен.

2 голосов
/ 25 августа 2009

Spring имеет нечто, называемое HandlerAdapter, которое принимает запрос и реализацию контроллера и вызывает его. Это позволяет повторно использовать контроллеры из других сред. Вы хотите AnnotationMethodHandlerAdapter . Я полагаю, что вы можете создать это сами:

HandlerAdapter adapter = new AnnotationMethodHandlerAdapter();
ModelAndView modelAndView = adapter.handle(request, response, controller);

Я сам сделал нечто подобное - но я не уверен, не оставляю ли я что-то важное.

0 голосов
/ 25 августа 2009

Вы могли бы представить свой собственный интерфейс, который бы позволял легко выполнять такое общее поведение дескриптора - учитывая переписывание, - что вы собираетесь делать программно? например какое дерево решений - встроенные отображения параметров довольно гибкие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...