@ResponseBody
你可以对方法使用 @ResponseBody 注解,使其返回值通过 HttpMessageConverter 序列化到响应主体中。
使用示例
java
@GetMapping("/accounts/{id}")
@ResponseBody
public Account handle(@PathVariable String id) {
return accountService.get(id); // 该对象会自动转为 JSON
}kotlin
@GetMapping("/accounts/{id}")
@ResponseBody
fun handle(@PathVariable id: String): Account {
return accountService.get(id)
}关键特性
- 继承性:可以在类级别使用,此时所有方法都默认生效。
- @RestController:这是一个组合注解,等于
@Controller+@ResponseBody。 - 文件支持:可以返回
Resource类型,Spring 会自动将其输入流拷贝到响应中。 - 异步支持:可以配合响应式类型(如
Mono,Flux)或异步结果使用。
补充教学
1. 为什么它是现代 Web 开发的基石?
在传统的 MVC 中,Controller 返回的是逻辑视图名(String)。通过 @ResponseBody,Spring 把这种模式切换到了 “面向数据(Data-Oriented)”。这使得同一个后端可以同时为 Web 网页、Android 客户端和 iOS 客户端提供一致的数据接口。
2. 返回 Resource 的小技巧
当你写大文件下载接口时,不要一次性把文件读进内存返回:
java
@GetMapping("/download")
@ResponseBody
public Resource download() {
return new FileSystemResource("/path/to/large-video.mp4");
}Spring 会使用流式拷贝,既节省内存,又能正确处理 Range 请求(支持断点续传)。
3. 内容协商 (Content Negotiation)
如果你的方法返回一个 User 对象,Spring 会怎么决定转成 JSON 还是 XML?
- Accept 标头:看前端想要什么(
Accept: application/json)。 - 可用转换器:看你类路径下有什么库(有 Jackson 就能给 JSON,有 JAXB 就能给 XML)。 这就是 Spring 强大的内置一致性。