Come sapere quali URL sono mappati nel contesto servlet corrente in un metodo Controller Spring 2.0?

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

  •  03-07-2019
  •  | 
  •  

Domanda

In Spring 2.0, c'è un modo rapido per avere un elenco degli URL mappati del contesto servlet corrente dall'interno di un metodo Controller?

Sto scrivendo un metodo chiamato getMappedUrls () e lo scopo di questo metodo è mostrare quali URL sono mappati nel contesto servlet corrente.

Questo metodo deve essere utilizzato per generare un piccolo documento online dei servizi disponibili.

Grazie!

[Modifica]

La risposta di Kent Lai funziona per me:

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);
}
È stato utile?

Soluzione

Sembra un'idea interessante, quindi sono andato a scavare nel codice sorgente MVC di Spring Web per scoprire se c'è un modo.

Per prima cosa ho attivato il debug per la mia registrazione del framework di primavera (log4j) e ho notato che i mapping sono stati eseguiti nella mia classe org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping (poiché lo sto usando).

Scavando furthur, ho notato che tutti i mapping dei gestori vengono aggiunti a una mappa dei gestori, che puoi ottenere da org.springframework.web.servlet.handler.AbstractUrlHandlerMapping # getHandlerMap

Supponendo che tu stia utilizzando un gestore che ne deriva.

Successivamente, scopro che DispatcherServlet sta usando HandlerMapping, implementato da AbstractUrlHandlerMapping (e AbstractHandlerMapping), per risolvere l'URL (ovviamente ovviamente devono usarlo). E si scopre che DispatcherServlet contiene un altro elenco di handlerMappings

org.springframework.web.servlet.DispatcherServlet # handlerMappings

La cattiva notizia qui è, beh, è ??una variabile di istanza di classe protetta.

Quindi la mia migliore raccomandazione (se questa può essere considerata la migliore) che puoi fare per scoprire tutto l'URL mappato è

  1. Ottieni un'istanza di ApplicationContext.
  2. Scopri tutti i bean di almeno tipo AbstractUrlHandlerMapping (dal momento che qualsiasi cosa su furthur non ti dice alcun URL mappato).
  3. Scorrere l'elenco e chiamare getHandlerMap e ottenere tutto il keySet, che è l'URL mappato.

Nota che questo è ciò che ho scoperto dal mio uso delle annotazioni @RequestMapping. Non sono sicuro di quanto sia diverso se si stanno mappando gli URL nei file di configurazione di primavera.

Altri suggerimenti

La specifica servlet nasconde queste informazioni dal codice servlet. È possibile ottenere solo il percorso di contesto utilizzato per la richiesta corrente. Se riesci ad accedere a web.xml, sarai in grado di inferire i mapping da lì, ma è un po 'un trucco. È inoltre possibile che ogni servlet si registri all'avvio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top