Spring RequestMapping头痛

时间:2013-05-01 17:02:18

标签: spring tomcat spring-mvc

我最后一次冒险的新鲜事,现在我正试图绘制更复杂的URL,并试图让它按照Spring的文档建议的方式运行。

同样,工具是:

  • Java 1.6
  • Spring 3.2 MVC
  • Tomcat 7

我要做的是匹配foo / bar / id 形式的网址,其中 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,result:/ mycontext / foo works。
  • 方法映射:/ foo / *,url-filter:/ foo / *,result:成功将方法映射到部署时报告的/ foo / *,但访问/ mycontext / foo / bar失败。
  • 方法映射:/ foo / *,url-filter:/ foo / bar,result:在部署时映射,但访问/ mycontext / foo / bar失败。
  • 方法映射:/ foo / bar,url-filter:/ foo / bar,结果:/ mycontext / foo / bar有效。
  • 方法映射:/ foo / bar / *,url-filter:/ foo / bar / *,result:在部署时映射,但访问/ mycontext / foo / bar /(任何)失败。
  • 方法映射:/ foo / bar / {id},url-filter:/ foo / bar / *,result:在部署时映射,但访问/ mycontext / foo / bar /(任何)失败。

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

在这里我是否对通配符有所了解?

1 个答案:

答案 0 :(得分:1)

如果你有@RequestMapping("/foo/bar/{id}"),那么在与DispatcherServlet的url-pattern匹配结合后会映射它。考虑一个案例,例如,url-pattern如下:

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

在这种情况下,只有来自客户端的调用是:/dispatcher/foo/bar/1

,DispatcherServlet才会映射该方法

因此,如果您想要说@RequestMapping来回复http://<server>/<context>/foo/bar/1,请将DispatcherServlet的url-pattern设置为/

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