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;
}

再次,如果客户端请求不同的媒体类型,我的应用程序逻辑将完全不同,因此在这种情况下,Spring的ContentNegotiatingViewResolver或消息转换器似乎不是很有用,因为我想将请求路由到不同的处理代码,而不是运行相同的代码段并渲染它们根据请求的媒体类型使用不同的格式。

据我所知,例如在泽西岛的JAX-RS中,您可以为此使用@Consume批注。我想知道spring该怎么做吗?谢谢。


问题答案:

@RequestMapping标注有一个可选的headers属性,使您可以缩小映射与特定的头文件的请求,如匹配XML:

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

您还可以指定多个变体:

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

它有点低,但是可以完成工作。