spring-mvc:如何以“ a / b / {c}”的形式映射URI模板?


问题内容

我可以使用“ / a / b”或“ / a / {b}”形式的URI模板来工作。但是,当我尝试“ / a / b / {c}”时,我收到了一条HTTP
404和一条消息,消息形式为“未找到带有URI [/ myapp / a / b / c]的HTTP请求的映射”。
..“但是我也在日志中看到了这些消息,这使我相信映射是正确的…?

INFO: Mapped URL path [/a] onto handler 'AController'
Nov 16, 2010 12:18:39 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler
INFO: Mapped URL path [/a/*] onto handler 'AController'
Nov 16, 2010 12:18:39 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler

我注意到spring-mvc文档中的所有示例都以 “ / a
/ {b}”或/ a / {b} / c / {d}”的形式显示URI模板。“ / a / b / {
c}”不可能吗?是否需要在web.xml中进行任何配置才能使这种情况发生?或者某些(错误)配置会阻止该模式被映射?目前我的调度程序servlet已映射到:

<url-pattern>/</url-pattern>

控制器如下所示:

@Controller
public class AController {
    @RequestMapping(value = "/a/b/{c}", method = RequestMethod.GET)
    public ModelAndView show() {
        ModelAndView modelAndView = new ModelAndView("A");
        return modelAndView;
    }
}

访问http:// localhost:8080 / myapp / a / b /
c
返回404,我在日志中看到了这一点:

Nov 16, 2010 12:19:06 PM org.springframework.web.servlet.DispatcherServlet noHandlerFound
WARNING: No mapping found for HTTP request with URI [/myapp/a/b/c] in DispatcherServlet with name 'dispatcher'

关于如何正确获取URI模式的任何想法?


问题答案:

看起来仅当ControllerClassNameHandlerMapping用作处理程序映射时,才会发生这种情况。

带注释的控制器通常与一起使用DefaultAnnotationHandlerMapping,在这种情况下,一切正常。

编辑:
实际上,它看起来像是的合法行为ControllerClassNameHandlerMapping。它映射aController/a/*而不是/a/**,因此仅接受路径层次的一个级别。同样,如果您需要完全的灵活性,请使用DefaultAnnotationHandlerMapping