Spring MVC RequestMapping匹配错误的URL

时间:2011-05-13 13:31:17

标签: spring spring-mvc

我为一个webapp构建了一个rest api,遇到了RequestMapping的问题。

基本上有用户,这些用户被分组到不同的域中。当他们使用系统时,一些信息存储在名为“会话”的对象中。并写入DB。

我有以下网址:

1) http://server.com/api/v1/domain/ domainName / sessions - 显示有关域中所有用户的所有会话的信息。< / p>

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 + Annotations

使用SimpleUrlHandlerMapping指定控制器的基本路径:

<property name="mappings">
    <value>
    /api/v1/domain/** = api.DomainsController
    </value>
</property>

问题是两个网址都是由第一种方法处理的。对于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)

1 个答案:

答案 0 :(得分:1)

我认为最好不要混合使用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开头的请求,然后方法级请求映射与此相关。