如何确定给定URL的控制器(弹簧)

时间:2009-07-28 15:58:45

标签: java spring-mvc

使用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;
}

3 个答案:

答案 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);
    }           
}