【问题标题】:spring-mvc: how to map URI templates in the form of "a/b/{c}"?spring-mvc:如何以“a/b/{c}”的形式映射URI模板?
【发布时间】:2010-11-16 16:43:49
【问题描述】:

我可以获得“/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

我注意到所有the examples in the spring-mvc docs 都以“/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 模式有什么想法吗?

【问题讨论】:

    标签: spring spring-mvc


    【解决方案1】:

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

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

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

    【讨论】:

    • 我更新了上面的帖子以包含更多日志信息。看起来正在使用 AbstractUrlHandlerMapping?
    • @Sajee: AbstractUrlHandlerMapping 是一个基类。您上一个问题的日志清楚地表明使用了ControllerClassNameHandlerMapping
    • @axtavt:感谢您的帮助。我是 Spring 新手,所以你能指定我将如何使用 DefaultAnnotationHandlerMapping 吗?还有为什么文档说“在以前的 Spring 版本中,用户需要在 Web 应用程序上下文中定义 HandlerMappings 以将传入的 Web 请求映射到适当的处理程序。随着 Spring 2.5 的引入,DispatcherServlet 启用了 DefaultAnnotationHandlerMapping,它查找 @ @Controllers 上的 RequestMapping 注释。通常,您不需要覆盖此默认映射,除非您需要覆盖默认属性值。"?
    • 文档链接上面的引用:static.springsource.org/spring/docs/3.0.x/… 对我来说,听起来 DefaultAnnotationHandlerMapping 已经启用?
    • @Sajee:如果您手动声明了一些处理程序映射,则不会应用默认值。由于您上一个问题中的日志显示已声明ControllerClassNameHandlerMapping,因此您可能以某种方式声明了它,因此您需要删除该声明。
    【解决方案2】:

    你可以试试下面的,

    @RequestMapping(value = "/a/b/{c}", method = RequestMethod.GET)

    public ModelAndView show(@PathParam("c") String c) {
    
        ModelAndView modelAndView = new ModelAndView("A");
    
        return modelAndView;
    }
    

    【讨论】:

    • 不,那没用。我认为@axtavt 在上面的正确路径上,控制器仅映射到 /a/* 而不是 /a/**。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 2014-05-01
    • 2011-05-09
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    相关资源
    最近更新 更多