如何知道在 Spring 2.0 Controller 方法中的当前 servlet 上下文中映射了哪些 URL?

Séb*_*rra 3 java spring servlets

在 Spring 2.0 中,是否有一种快速方法可以从 Controller 方法内部获得当前 servlet 上下文的映射 URL 列表?

我正在编写一个名为 的方法getMappedUrls(),该方法的目的是显示在当前 servlet 上下文中映射了哪些 url。

此方法用于生成可用服务的小型在线文档。

谢谢!

[编辑]

Kent Lai 的回答对我有用:

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);
}
Run Code Online (Sandbox Code Playgroud)

Ken*_*Lai 5

这听起来像是一个有趣的想法,所以我去挖掘Spring Web MVC源代码,看看是否有办法。

首先,我打开了我的 spring 框架日志记录 ( log4j ) 的调试,并且我注意到映射是在我的org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping类中完成的(因为我正在使用它)。

进一步挖掘,我注意到所有处理程序映射都添加到处理程序映射中,您可以从 org.springframework.web.servlet.handler.AbstractUrlHandlerMapping#getHandlerMap

假设您使用的是从它派生的处理程序。

接下来,我发现DispatcherServlet正在使用HandlerMapping, which AbstractUrlHandlerMapping(and AbstractHandlerMapping) 实现,来解析 url(很明显他们必须使用它)。事实证明,它DispatcherServlet包含另一个 handlerMappings 列表

org.springframework.web.servlet.DispatcherServlet#handlerMappings

这里的坏消息是,它是一个受保护的类实例变量。

所以我最好的建议(如果这可以被认为是最好的),你可以找出所有映射的 url

  1. 获取 的实例ApplicationContext
  2. 找出至少类型的所有 bean AbstractUrlHandlerMapping(因为任何进一步的操作都不会告诉您任何映射的 url)。
  3. 迭代列表并调用getHandlerMap并获取所有 keySet,即映射的 url。

请注意,这是我从@RequestMapping注释的使用中挖掘出来的。如果您在 spring 配置文件中映射 url,我不确定它有什么不同。