Spring MVC 3.1 - 版本化REST Web服务

时间:2012-03-12 18:02:25

标签: spring rest spring-mvc versioning

我想通过为不同版本提供不同的Accept标头值来对我的REST-Webservice进行版本化(请参阅http://barelyenough.org/blog/2008/05/versioning-rest-web-services/)。

问题是,Spring MVC 3似乎无法实现。

我的控制器看起来像这样:

@Controller
@RequestMapping("test")
public class RestController {

@RequestMapping(method = RequestMethod.GET, produces = "application/vnd.example.item-v1+json")
@ResponseBody
public ItemV1 getItem() {
    return new ItemV1();
}

@RequestMapping(method = RequestMethod.GET, produces = "application/vnd.example.item-v2+json")
@ResponseBody
public ItemV2 getItem2() {
    return new ItemV2();
}
}

当我尝试访问其中一种方法时,我得到一个异常:

java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path '/test'

我错过了什么,或者Spring MVC是不可能的?我知道JAX-RS可以实现......

1 个答案:

答案 0 :(得分:1)

http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-produces

这应该是你有办法的方式。你如何在GET请求中指定Accept标头?您是否100%肯定您的GET请求发送的Accept标头值只会与您指定的一种或另一种内容类型相匹配?如果你发送一个匹配两者的标题,那么Spring将不知道哪个处理程序方法应该处理请求。

您可能需要打开org.springframework日志记录到DEBUG以查看发生了什么,或者使用断点调试器和Spring源代码来查看实际发生的情况。 “产生”是一个相对较新的功能,因此也有可能存在错误。

https://jira.springsource.org/secure/IssueNavigator.jspa?reset=true&jqlQuery=project+%3D+SPR+AND+%28summary+%7E+%22mvc+produces%22+OR+description+%7E+%22mvc+produces%22%29+AND+status+%3D+Open