Как узнать, какие URL-адреса отображаются в текущем контексте сервлета в методе контроллера Spring 2.0? - PullRequest
2 голосов
/ 05 января 2009

В Spring 2.0, есть ли быстрый способ получить список сопоставленных URL-адресов текущего контекста сервлета из метода Controller?

Я пишу метод с именем getMappedUrls(), и цель этого метода - показать, какие URL отображаются в текущем контексте сервлета.

Этот метод используется для создания небольшого онлайн-документа о доступных сервисах.

Спасибо!

[Изменить]

Ответ Кента Лая работает для меня:

final Map<Object, AbstractUrlHandlerMapping> beans =
    getApplicationContext().getBeansOfType(AbstractUrlHandlerMapping.class);
for (final AbstractUrlHandlerMapping bean : beans.values())
{
    final Map<String, Object> mapping = bean.getHandlerMap();
    for(final String url : mapping.keySet())
        urls.add(url);
}

Ответы [ 2 ]

4 голосов
/ 06 января 2009

Это звучит как интересная идея, и поэтому я пошел копаться в исходном коде Spring Web MVC, чтобы выяснить, есть ли способ.

Сначала я включил отладку для своего весеннего каркаса каркаса (log4j) и заметил, что сопоставления сделаны в моем классе org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping (поскольку я использую это).

Копая Фуртур, я заметил, что все сопоставления обработчиков добавляются в карту обработчиков, которую вы можете получить из org.springframework.web.servlet.handler.AbstractUrlHandlerMapping # getHandlerMap

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

Далее я обнаружил, что DispatcherServlet использует HandlerMapping, который реализует AbstractUrlHandlerMapping (и AbstractHandlerMapping), для разрешения URL (очевидно, они должны его использовать). И оказывается, что DispatcherServlet содержит еще один список обработчиковMappings

org.springframework.web.servlet.DispatcherServlet # handlerMappings

Плохая новость в том, что это переменная экземпляра защищенного класса.

Так что моя лучшая рекомендация (если это можно считать наилучшей), которую вы можете сделать, чтобы выяснить все отображенные URL-адреса:

  1. Получите экземпляр ApplicationContext.
  2. Найдите все компоненты по крайней мере типа AbstractUrlHandlerMapping (поскольку что-либо еще не говорит вам ни о каком отображенном URL).
  3. Выполните итерацию списка и вызовите getHandlerMap и получите весь набор ключей, который является отображаемым URL.

Обратите внимание, что это то, что я извлек из своего использования аннотаций @RequestMapping. Я не уверен, насколько это отличается, если вы отображаете URL-адреса в файлах конфигурации Spring.

1 голос
/ 05 января 2009

Спецификация сервлета скрывает эту информацию от кода сервлета. Вы можете получить только контекстный путь, используемый для текущего запроса. Если вы сможете получить доступ к web.xml, вы сможете вывести сопоставления оттуда, но это немного хак. Вы также можете зарегистрировать каждый сервлет при запуске.

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