Могу ли я получить весь URL-адрес requestMapping с помощью метода GET весной?

Я хочу создать файл sitemap.xml динамически. Если тогда мне нужно получить все URL-адреса в контроллере, как я могу разрешить такие вещи?

Все, что я хочу сделать, это сгенерировать sitemap.xml с помощью spring.

В sitemap.xml есть все URL-адреса, которые поисковая система должна сканировать на моем сайте, и поэтому мне нужно это решение.


person Richard    schedule 19.03.2016    source источник


Ответы (1)


Следующий код извлекает все RequestMappingInfo экземпляры из @RequestMapping аннотаций типа и уровня метода в @Controller классах.

// context = ApplicationContext
Map<String, RequestMappingHandlerMapping> matchingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(context,
    RequestMappingHandlerMapping.class, true, false);

if (!matchingBeans.isEmpty()) {
    ArrayList<HandlerMapping> handlerMappings = new ArrayList<HandlerMapping>(matchingBeans.values());
    AnnotationAwareOrderComparator.sort(handlerMappings);

    RequestMappingHandlerMapping mappings = matchingBeans.get("requestMappingHandlerMapping");
    Map<RequestMappingInfo, HandlerMethod> handlerMethods = mappings.getHandlerMethods();

    for (RequestMappingInfo requestMappingInfo : handlerMethods.keySet()) {
        RequestMethodsRequestCondition methods = requestMappingInfo.getMethodsCondition();

        // Get all requestMappingInfos with 
        //  1) default request-method (which is none) 
        //  2) or method=GET
        if (methods.getMethods().isEmpty() || methods.getMethods().contains(RequestMethod.GET)) {
            System.out.println(requestMappingInfo.getPatternsCondition().getPatterns() + " -> produces " +
                    requestMappingInfo.getProducesCondition());
        }
    }
}

Вероятно, вам нужно отфильтровать сопоставления для страниц ошибок. Объект RequestMappingInfo содержит всю соответствующую информацию о сопоставлении, которую вы определяете для аннотаций @RequestMapping, таких как:

  • RequestMappingInfo.getMethods() -> @RequestMapping(method=RequestMethod.GET)
  • RequestMappingInfo.getPatternsCondition().getPatterns() -> @RequestMapping(value = "/foo")
  • и т. д. для получения дополнительной информации см. RequestMappingInfo

Чтобы еще поймать, например. ViewController также необходимо отфильтровать тип SimpleUrlHandlerMapping:

Map<String, SimpleUrlHandlerMapping> matchingUrlHandlerMappingBeans = BeanFactoryUtils.beansOfTypeIncludingAncestors(context,
            SimpleUrlHandlerMapping.class, true, false);
SimpleUrlHandlerMapping mappings = matchingUrlHandlerMappingBeans.get("viewControllerHandlerMapping");
System.out.println(mappings.getUrlMap());
person fateddy    schedule 19.03.2016
comment
Рад, что смог помочь! - person fateddy; 20.03.2016