Como saber quais URLs são mapeadas no contexto servlet atual em um método Controlador de Primavera 2.0?

StackOverflow https://stackoverflow.com/questions/413799

  •  03-07-2019
  •  | 
  •  

Pergunta

Na Primavera 2.0, há uma maneira rápida de ter uma lista de URLs mapeados do atual contexto servlet de dentro de um método de controlador?

Eu estou escrevendo um método chamado getMappedUrls(), eo propósito deste método é mostrar o que urls são mapeadas no contexto servlet atual.

Este método deve ser usado para gerar uma pequena doc on-line de serviços disponíveis.

Obrigado!

[Edit]

A resposta de Kent Lai funciona para mim:

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);
}
Foi útil?

Solução

Isso soa como uma idéia interessante, e então eu fui para cavar dentro do código fonte Spring Web MVC para saber se há uma maneira.

Primeiro liguei debug para o meu registro de Spring Framework (log4j), e notei mapeamentos são feitos em minha classe org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping (desde que eu estou usando isso).

Indo furthur, notei que todos os mapeamentos de manipulador são adicionados a um mapa manipulador, que pode ser obtido a partir de org.springframework.web.servlet.handler.AbstractUrlHandlerMapping # getHandlerMap

Assumindo que você está usando um manipulador que dela deriva.

Em seguida, eu descobrir que DispatcherServlet está usando o HandlerMapping, que AbstractUrlHandlerMapping (e AbstractHandlerMapping) implementa, para resolver o url (bem, obviamente, eles têm de usá-lo). E verifica-se que DispatcherServlet detém uma outra lista de handlerMappings

org.springframework.web.servlet.DispatcherServlet # handlerMappings

A má notícia aqui é, bem, é uma variável de instância de classe protegido.

Assim, a minha melhor recomendação (se isso pode ser considerado o melhor) que você pode fazer para descobrir toda a mapeado URL é

  1. Se apossar de uma instância de ApplicationContext.
  2. Saiba todos os grãos de pelo menos tipo AbstractUrlHandlerMapping (já que qualquer coisa furthur se não lhe diz qualquer url mapeada).
  3. Iterate da lista e chamar getHandlerMap e obter todas as keySet, que é a url mapeada.

Note que este é o que eu cavar para fora de meu uso de anotações @RequestMapping. Não tenho a certeza como é diferente se você está mapeando urls em seus arquivos de configuração de primavera.

Outras dicas

Os servlet especificação peles esta informação do código de servlet. Você só pode obter o caminho do contexto usado para a solicitação atual. Se você pode chegar ao web.xml, você seria capaz de inferir os mapeamentos de lá, mas isso é um pouco de um hack. Você também pode ter cada servlet se registrar na inicialização.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top