Rest springmvc中的内容协商

Rest springmvc中的内容协商,rest,spring-mvc,Rest,Spring Mvc,我正在用Spring3编写一个RESTful web应用程序,我的部分应用程序需要根据请求的媒体类型处理数据 @RequestMapping(...) public String process() { if(requested_media_type_is_xml) { processXml(); } else if(requested_media_type_is_json) { processJson(); } return something; }

我正在用Spring3编写一个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或message converter在这种情况下似乎不是很有用,因为我希望将请求路由到不同的处理代码,而不是运行相同的代码段,并根据请求的媒体类型以不同的格式呈现它们

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

据我所知,在JAX-RS中,例如Jersey,您可以使用@Consume注释来实现这一点。我想知道春天是怎么做的?谢谢。

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

@RequestMapping(value = "/something", headers = "content-type=application/xml")
您还可以指定多个变体:

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

虽然skaffman的答案是正确的,但我在最新的Spring发行版(3.1 M2)中发现了一种更好的替代方法,使用
消耗
生成
值:

@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) {
    // ...
}
请在此处查看更多详细信息:

更新:

以下是有关这方面的官方Spring文档:


谢谢你的回答。这对我很有用。您知道Spring是否会执行内容协商工作并根据此请求路由吗?如果客户端发送“text/html,application/xml;q=0.9”这样的“Accept”头,这仍然有效吗?可以在这里使用通配符“*/*”和“text/*”吗?@nybon:好问题-headers
属性支持通配符,所以应该可以正常工作。我做了一些测试,以下是我的发现:1)对于“Accept”标题中的多种媒体类型,可以使用:headers=“Accept=application/json,application/xml”2)您可以使用不同的“Accept”头指定多个@RequestMapping注释:@RequestMapping(…,headers=“Accept=application/xml”)公共对象getXml(…){…}@RequestMapping(…,headers=“Accept=application/json”)公共对象getJson(…){…},Spring将为您决定客户首选哪种格式。例如,如果客户端发送一个带有“Accept”头的请求,比如“application/json;q=0.9,application/xml;q=0.95”,Spring将把这个请求路由到getXml方法来处理这个请求,这正是我想要实现的。非常感谢。您如何将
@Controller
符号附加到方法上?嗯,我只是从Spring的官方博客条目中复制了这段代码片段,如上所述。他们发布的代码似乎有些错误。