Есть ли в Spring 2.0 быстрый способ получить список отображаемых URL-адресов текущего контекста сервлета изнутри метода контроллера?
Я пишу метод под названием 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);
}




Спецификация сервлета скрывает эту информацию от кода сервлета. Вы можете получить только контекстный путь, используемый для текущего запроса. Если вы можете добраться до web.xml, вы сможете сделать вывод о сопоставлениях оттуда, но это своего рода взлом. Вы также можете зарегистрировать каждый сервлет при запуске.
Это звучит как интересная идея, поэтому я начал копаться в исходном коде Spring Web MVC, чтобы узнать, есть ли способ.
Сначала я включил отладку для ведения журнала Spring Framework (log4j) и заметил, что сопоставления выполняются в моем классе org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping (поскольку я его использую).
Копаясь дальше, я заметил, что все сопоставления обработчиков добавляются в карту обработчиков, которую вы можете получить из
org.springframework.web.servlet.handler.AbstractUrlHandlerMapping#getHandlerMap
Предполагая, что вы используете обработчик, производный от него.
Затем я узнаю, что DispatcherServlet использует HandlerMapping, который реализует AbstractUrlHandlerMapping (и AbstractHandlerMapping), для разрешения URL-адреса (ну, очевидно, они должны его использовать). И оказывается, что DispatcherServlet содержит еще один список обработчиков.
org.springframework.web.servlet.DispatcherServlet#handlerMappings
Плохая новость в том, что это переменная экземпляра защищенного класса.
Итак, моя лучшая рекомендация (если это можно считать лучшим), что вы можете сделать, чтобы узнать, весь сопоставленный URL-адрес
ApplicationContext.AbstractUrlHandlerMapping (поскольку все, что происходит дальше, не сообщает вам какой-либо сопоставленный URL-адрес).getHandlerMap и получите весь набор ключей, который является сопоставленным URL-адресом.Обратите внимание, что это то, что я обнаружил при использовании аннотаций @RequestMapping. Я не уверен, насколько это отличается, если вы сопоставляете URL-адреса в своих файлах конфигурации Spring.