我正在使用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的方法是什么?感谢。
答案 0 :(得分:10)
尽管skaffman的答案是正确的,但我在最新的Spring版本(3.1 M2)中发现,使用consumes
和produces
值可以有另一种更好的方法:
@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文档:
答案 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"}])
这是一个有点低级别,但做的工作。