Spring MVC中的内容协商

时间:2011-07-04 07:17:00

标签: rest spring-mvc

我正在使用Spring 3编写RESTful Web应用程序,我的部分应用程序需要根据请求的媒体类型处理数据。

@RequestMapping(...)
public String process() {
  if(requested_media_type_is_xml) {
     processXml();
  }
  else if(requested_media_type_is_json) {
     processJson();
  }
  return something;
}

Aka,如果客户端请求不同的媒体类型,我的应用程序逻辑就完全不同了,所以看起来Spring的ContentNegotiatingViewResolver或消息转换器在这种情况下并不是很有用,因为我想将请求路由到不同的处理代码而不是运行相同的代码片段并根据请求的媒体类型以不同的格式呈现它们。

据我所知,例如在泽西岛的JAX-RS中,您可以使用@Consume注释。我想知道Spring的方法是什么?感谢。

2 个答案:

答案 0 :(得分:10)

尽管skaffman的答案是正确的,但我在最新的Spring版本(3.1 M2)中发现,使用consumesproduces值可以有另一种更好的方法:

@RequestMapping(value="/pets", consumes="application/json")
public void addPet(@RequestBody Pet pet, Model model) {
    // ...
}

@Controller
@RequestMapping(value = "/pets/{petId}", produces="application/json")
@ResponseBody
public Pet getPet(@PathVariable String petId, Model model) {
    // ...
}

请在此处查看更多详情: http://blog.springsource.com/2011/06/13/spring-3-1-m2-spring-mvc-enhancements-2/

更新

以下是关于此的官方Spring文档:

http://static.springsource.org/spring/docs/3.1.0.M2/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-consumes

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

答案 1 :(得分:2)

@RequestMapping注释具有可选的headers属性,允许您将映射范围缩小到具有特定标头的请求,例如匹配XML:

@RequestMapping(value = "/something", headers = "content-type=application/xml")

您还可以指定多个变体:

@RequestMapping(value = "/something", headers = [{"content-type=application/xml","content-type=text/xml"}])

这是一个有点低级别,但做的工作。