【问题标题】:Spring RequestMapping headachesSpring RequestMapping 令人头疼的问题
【发布时间】:2013-04-25 17:23:26
【问题描述】:

刚刚结束我的最后一次冒险,现在我正在尝试映射更复杂的 URL,并疯狂地尝试使其按照 Spring 文档建议的方式工作。

同样,工具是:

  • Java 1.6
  • Spring 3.2 MVC
  • 雄猫 7

我要做的是匹配 foo/bar/id 形式的 URL,其中 id 是一个整数。看起来我应该这样做的方式是像这样注释我的控制器方法:

@RequestMapping("/foo/bar/{id}")

然后在 web.xml 中有这个:

<url-filter>/foo/*</url-filter>

或者这个:

<url-filter>/foo/bar/*</url-filter>

然后在部署到 Tomcat 之后,我应该能够访问 /mycontext/foo/bar/id。但这不起作用。

为了完整起见,这里有几个变体和结果:

  • 方法映射:/foo,url-filter:/foo,结果:/mycontext/foo 有效。
  • 方法映射:/foo/*,url-filter:/foo/*,结果:部署时报告方法成功映射到 /foo/*,但访问 /mycontext/foo/bar 失败。
  • 方法映射:/foo/*,url-filter:/foo/bar,结果:在部署时映射,但访问 /mycontext/foo/bar 失败。
  • 方法映射:/foo/bar,url-filter:/foo/bar,结果:/mycontext/foo/bar 有效。
  • 方法映射:/foo/bar/*,url-filter:/foo/bar/*,结果:在部署时映射,但访问 /mycontext/foo/bar/(anything) 失败。
  • 方法映射:/foo/bar/{id},url-filter:/foo/bar/*,结果:在部署时映射,但访问 /mycontext/foo/bar/(anything) 失败。

所有失败都伴随着来自 mycontext 的 DispatcherServlet 的错误消息,即未找到映射,即使所有失败都报告在部署时设置映射成功。由于我从正确的 DispatcherServlet 收到错误,这表明我的 url-filter 设置很好。但是关于部署成功映射的消息引用了 @RequestMapping 注释中的任何内容,所以我不知道 Spring 首先说它很好,然后说它不匹配。

这里关于通配符有什么我不明白的地方吗?

【问题讨论】:

  • 对不起,我不熟悉“url-filter”你能提供更多关于它的上下文吗?

标签: spring tomcat spring-mvc


【解决方案1】:

如果您有@RequestMapping("/foo/bar/{id}"),则在与 DispatcherServlet 的 url-pattern 匹配后进行映射。考虑一个例子,例如,url-pattern 如下:

<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/dispatcher</url-pattern>
</servlet-mapping>

在这种情况下,DispatcherServlet 将仅在来自客户端的调用为:/dispatcher/foo/bar/1 时才映射方法

因此,如果您想让 @RequestMapping 响应 http://&lt;server&gt;/&lt;context&gt;/foo/bar/1,只需将 DispatcherServlet 的 url-pattern 设置为 /

<servlet-mapping>
    <servlet-name>spring</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2013-06-08
    相关资源
    最近更新 更多