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

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

  •  03-07-2019
  •  | 
  •  

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

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

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

谢谢!

[编辑]

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);
}
有帮助吗?

解决方案

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

首先我打开了spring spring framework log(log4j)的调试,我注意到我的org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping类完成了映射(因为我正在使用它)。

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

假设您正在使用从中派生的处理程序。

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

org.springframework.web.servlet.DispatcherServlet#的HandlerMappings

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

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

  1. 获取ApplicationContext的实例。
  2. 找出至少类型为AbstractUrlHandlerMapping的所有bean(因为任何更新的东西都不会告诉你任何映射的URL)。
  3. 迭代列表并调用getHandlerMap并获取所有keySet,即映射的URL。
  4. 请注意,这是我从@RequestMapping注释的用法中挖掘出来的。如果您在弹簧配置文件中映射URL,我不确定它有多么不同。

其他提示

servlet规范从servlet代码中隐藏了这些信息。您只能获取用于当前请求的上下文路径。如果你可以访问web.xml,你就可以从那里推断出映射,但这有点像黑客攻击。您也可以在启动时让每个servlet注册。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top