为什么我的Spring服务返回客户端请求的任何内容类型?

时间:2012-02-02 21:10:48

标签: java spring spring-mvc

我使用Spring 3.1.0.RELEASE进行Spring休息服务。以下是相关服务电话的相关代码:

@RequestMapping(value="/{var1}", method=RequestMethod.GET, produces="application/json")
@ResponseBody
public String getSomeStuff(@PathVariable final String var1) {
    return myJsonString;
}

如果我使用以下curl命令调用它,它很高兴地返回我的内容类型为application / xml的json字符串,而我期望基于Spring 3.1文档的406:

curl -v -H "Accept: application/xml" http://localhost:8080/MyServiceSite/myvalue

我的应用程序中没有针对此服务的额外配置(没有序列化),我返回原始json,没有对配置的服务进行后处理。我确定我错过了什么,有人能指出我可能错过的任何东西吗?

编辑:这是我试图让这个工作时看到的documentation。具体见第16.3.2.5节。我的代码非常相似,只是它们的代码看起来像是假设配置设置让Spring处理序列化。绕过Spring序列化时,产品可能不起作用吗?

编辑:我改变了对响应代码的期望。 A 415表示我在我的请求正文中发送了不正确的内容,而406则适用于不接受服务器内容类型的接受标头。

无论如何,我已经改变了这个方法确实返回一个Map并为它添加了配置序列化为json,现在如果我从客户端发送一个无效的内容类型,我得到了正确的406响应。当方法的输出没有被序列化时,似乎可能会忽略“生成”设置。

2 个答案:

答案 0 :(得分:1)

headers的{​​{1}}属性怎么样?您可以在那里设置Accept标头。类似的东西:

@RequestMapping

我不知道Spring如何在没有匹配头的情况下处理对该路径的请求。如果它没有给出你想要的东西,你可能需要定义一个没有标题的类似映射,并让它发送回ResponseEntity并设置响应代码或其他东西,但我希望它会适当地处理它。

答案 1 :(得分:1)

产生条件对于Spring MVC 3.1来说是新的,只有RequestMappingHandlerMapping和相关的@MVC支持类支持,new in Spring 3.1。我的猜测是你正在使用3.0 @MVC支持类,它们不支持生成条件。否则您的代码是正确的,您对应该发生的事情的期望也是正确的。

3.1中不需要使用headers =“Accept = application / json”。这正是引入生产条件的原因。