内容类型和@ResponseBody在春天

时间:2016-08-03 13:21:39

标签: java spring spring-mvc spring-restcontroller

这可能很简单,但对我来说理解会很有帮助......

我在restcontroller中使用@ResponseBody将String值返回给浏览器。响应字符串已在浏览器中成功接收。

即:

@RequestMapping(value="/foo", method=RequestMethod.GET)
@ResponseBody
public String foo() {
    return "bar";
}

上述回复的内容类型是什么?如果这就像在servlet响应中编写setAttribute那么属性名称是什么?

如果浏览器只接受“application / json”,那么spring会如何处理响应?

2 个答案:

答案 0 :(得分:4)

提交的代码生成text / html,默认情况下所有映射的Controller方法都是如此。如果要生成application / json,则必须将RequestMapping更改为

@RequestMapping(value="/foo", method=RequestMethod.GET, produces = "application/json")

但是,这不是有效的Json String,您必须更改它,因为您提交的方法将返回空体。提交的示例将是有效的text / plain。

当请求包含标头"Accept: application/json"并返回其他内容类型时,Spring返回Json类型的响应,说明抛出了HttpMediaTypeNotAcceptableException

关于servlet类比 - 请解释一下,我不完全明白你的意思。 String作为响应主体返回,它与请求属性非常不同。你想达到什么目的?

答案 1 :(得分:2)

我假设内容类型是纯文本/文本。如果请求集接受“application / json”,则取决于您的浏览器/工具。大多数休息客户端不会显示它,因为它不是application / json。如果你直接调用API,我会认为它是由于浏览器内容嗅探而显示的(可以通过标题禁用)。