Spring MVC RequestMapping匹配错误的URL
问题内容:
我正在为一个Web应用程序构建一个REST API,并且遇到了RequestMapping问题。
基本上有用户,这些用户被分组到各个域中。当他们使用系统时,一些信息将存储在一个名为“会话”的对象中,并写入数据库。
我有以下网址:
1) **http://server.com/api/v1/domain/ domainName /
sessions-**显示有关域中所有用户的所有会话的信息。
2) **http://server.com/api/v1/domain/ domainName / user / userName /
sessions-**显示有关特定用户会话的信息。
我正在使用spring 3.0.5,并在我的控制器类中声明了2个处理程序:
@RequestMapping(value = "/{domainId}/sessions", method=RequestMethod.GET)
public void findSessions(@PathVariable final String domainId) {
...
}
@RequestMapping(value = "/{domainId}/user/{username}/sessions", method=RequestMethod.GET)
public void findUserSessions(
@PathVariable final String domainId,
@PathVariable final String username) {
...
}
我正在使用混合控制器映射:SimpleUrlHandlerMapping +注释
使用SimpleUrlHandlerMapping指定控制器的基本路径:
<property name="mappings">
<value>
/api/v1/domain/** = api.DomainsController
</value>
</property>
问题在于两个URL都由第一种方法处理。对于URL 2,用户名绑定到 domainId pathvariable,从而制动方法逻辑。
但是,如果我在请求映射中指定完整路径,则可以正常工作。
@RequestMapping(value = "/api/v1/domain/{domainId}/sessions", method=RequestMethod.GET)
@RequestMapping(value = "/api/v1/domain/{domainId}/user/{username}/sessions", method=RequestMethod.GET)
问题答案:
我认为最好不要混合使用SimpleUriHandlerMapping和RequestMapping方法。我认为他们不是要一起工作。
我认为您想要的只是/ api / v1 / domain的类级别RequestMapping,然后是个别情况的方法级别映射。
因此,换句话说,删除SimpleUrlHandlerMapping条目并改为执行以下操作:
@Controller
@RequestMapping(value = "/api/v1/domain")
public class DomainsController {
@RequestMapping(value = "/{domainId}/sessions", method=RequestMethod.GET)
public void findSessions(@PathVariable final String domainId) {
...
}
@RequestMapping(value = "/{domainId}/user/{username}/sessions", method=RequestMethod.GET)
public void findUserSessions(
@PathVariable final String domainId,
@PathVariable final String username) {
...
}
}
这告诉Spring该控制器负责所有以/ api / v1 / domain开头的请求,然后方法级别的请求映射与此相对。