Comment savoir quelles URL sont mappées dans le contexte de servlet actuel dans une méthode de contrôleur Spring 2.0?

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

  •  03-07-2019
  •  | 
  •  

Question

Au printemps 2.0, existe-t-il un moyen rapide d’avoir une liste des URL mappées du contexte du servlet actuel à l’intérieur d’une méthode Controller?

J'écris une méthode appelée getMappedUrls () , et le but de cette méthode est de montrer quelles URL sont mappées dans le contexte actuel du servlet.

Cette méthode doit être utilisée pour générer un petit document en ligne des services disponibles.

Merci!

[Modifier]

La réponse de Kent Lai fonctionne pour moi:

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);
}
Était-ce utile?

La solution

Cela semble être une idée intéressante. Je me suis donc penché sur le code source de Spring Web MVC pour déterminer s’il existait un moyen.

J'ai d'abord activé le débogage pour ma journalisation Spring Framework (log4j) et j'ai remarqué que les mappages étaient effectués dans ma classe org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping (depuis que je l'utilise).

En fouillant plus loin, j’ai remarqué que tous les mappages de gestionnaires sont ajoutés à une carte de gestionnaires, que vous pouvez obtenir à partir de org.springframework.web.servlet.handler.AbstractUrlHandlerMapping # getHandlerMap

En supposant que vous utilisiez un gestionnaire qui en dérive.

Ensuite, je découvre que DispatcherServlet utilise HandlerMapping, que AbstractUrlHandlerMapping (et AbstractHandlerMapping) implémente, pour résoudre l’url (il est évident qu’ils doivent l’utiliser). Et il s'avère que DispatcherServlet contient une autre liste de handlerMappings

org.springframework.web.servlet.DispatcherServlet # handlerMappings

La mauvaise nouvelle est qu’il s’agit d’une variable d’instance de classe protégée.

Donc, ma meilleure recommandation (si cela peut être considéré comme préférable) que vous pouvez faire pour connaître toutes les URL mappées est

  1. Récupérer une instance de ApplicationContext.
  2. Recherchez tous les haricots d'au moins de type AbstractUrlHandlerMapping (car rien ne vous indique plus qu'une URL mappée).
  3. Parcourez la liste, appelez getHandlerMap et obtenez tous les jeux de clés, qui correspondent à l'URL mappée.

Notez que c’est ce que je tire de mon utilisation des annotations @RequestMapping. Je ne sais pas à quel point c'est différent si vous mappez des URL dans vos fichiers de configuration Spring.

Autres conseils

Les spécifications de servlet masquent ces informations du code de servlet. Vous pouvez uniquement obtenir le chemin de contexte utilisé pour la demande en cours. Si vous pouvez accéder au fichier web.xml, vous pourrez en déduire les mappages, mais c'est un peu un bidouillage. Vous pouvez également demander à chaque servlet de s’enregistrer au démarrage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top