使用spring DefaultAnnotationHandlerMapping如何查找最终会处理给定网址的Controller。
我目前有这个,但感觉应该比迭代超过100个请求映射更清晰:
public static Object getControllerForAction(String actionURL) {
ApplicationContext context = getApplicationContext();
AnnotationHandlerMapping mapping = (AnnotationHandlerMapping) context.getBean("annotationMapper");
PathMatcher pathMatcher = mapping.getPathMatcher();
for (Object key: mapping.getHandlerMap().keySet()) {
if (pathMatcher.match((String) key, actionURL)){
return mapping.getHandlerMap().get(key);
}
}
return null;
}
答案 0 :(得分:3)
出于这个问题的目的,DefaultAnnotationHandlerMapping
及其超类中的所有有趣方法都受到保护,因此外部代码不可见。但是,编写DefaultAnnotationHandlerMapping
的自定义子类会覆盖这些方法并使它们成为public
,这将是微不足道的。
由于您需要能够提供路径而不是请求对象,我建议lookupHandler
的{{1}}将是一个很好的候选者。它仍然需要你为它提供一个请求对象以及路径,但是该请求对象仅用于传递给validateHandler()方法,该方法什么都不做,所以你可能在那里提供一个null。
答案 1 :(得分:2)
所有mappers实现HandlerMapping
接口,该接口具有getHandler()
方法:
ApplicationContext context = getApplicationContext();
AnnotationHandlerMapping mapping = (AnnotationHandlerMapping) context.getBean("annotationMapper");
Object controller = mapping.getHandler().getHandler();
HandlerMapping.getHandler()
返回HandlerExecutionChain
,调用getHandler()
会返回实际的处理程序 - 对于控制器映射程序 - 将是您正在寻找的控制器。
答案 2 :(得分:2)
上面的内容在Spring 3.1中不起作用。您可以改为执行以下操作。
Map<String, AbstractHandlerMethodMapping> map = WebApplicationContextUtils.getWebApplicationContext(servletContext).getBeansOfType(AbstractHandlerMethodMapping.class);
Iterator<AbstractHandlerMethodMapping> iter = map.values().iterator();
while (iter.hasNext()) {
AbstractHandlerMethodMapping ahmb = iter.next();
Iterator<Object> urls = ahmb.getHandlerMethods().keySet().iterator();
while (urls.hasNext()) {
Object url = urls.next();
logger.error("URL mapped: " + url);
}
}