在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);
}
答案 0 :(得分:4)
这听起来像是一个有趣的想法,所以我去挖掘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
这里的坏消息是,它是受保护的类实例变量。
所以我可以做的最好的建议(如果这可以被认为是最好的),找出所有映射的网址
请注意,这是我从@RequestMapping注释的用法中挖掘出来的。如果您在弹簧配置文件中映射URL,我不确定它有多么不同。
答案 1 :(得分:1)
servlet规范从servlet代码中隐藏了这些信息。您只能获取用于当前请求的上下文路径。如果你可以访问web.xml,你就可以从那里推断出映射,但这有点像黑客攻击。您也可以在启动时让每个servlet注册。