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

Есть ли в 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);
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
3 106
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Ответ принят как подходящий

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

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

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

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

Затем я узнаю, что DispatcherServlet использует HandlerMapping, который реализует AbstractUrlHandlerMappingAbstractHandlerMapping), для разрешения URL-адреса (ну, очевидно, они должны его использовать). И оказывается, что DispatcherServlet содержит еще один список обработчиков.

org.springframework.web.servlet.DispatcherServlet#handlerMappings

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

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

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

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

Другие вопросы по теме