Spring MVC @ResponseBody注解
@ResponseBody 将方法返回值作为响应体返回,而非解析为视图名。
基本用法
Java
@Controller
public class UserController {
@GetMapping("/user/{id}")
@ResponseBody
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
}
返回的 User 对象会被序列化为 JSON:
JSON
{
"id": 1,
"name": "张三",
"email": "zhangsan@example.com"
}
方法级别使用
Java
@Controller
public class ApiController {
@GetMapping("/api/data")
@ResponseBody
public Map<String, Object> data() {
Map<String, Object> result = new HashMap<>();
result.put("code", 200);
result.put("message", "success");
return result;
}
}
类级别使用
Java
@Controller
@ResponseBody
public class UserController {
// 所有方法都返回响应体
}
// 等价于
@RestController
public class UserController {
// ...
}
返回类型
| 返回类型 | 说明 |
|---|---|
| 对象 | 自动序列化为 JSON |
| String | 直接返回字符串 |
| byte[] | 二进制数据 |
| ResponseEntity | 包含状态码和响应头 |
Java
@GetMapping("/text")
@ResponseBody
public String text() {
return "Hello World";
}
@GetMapping("/bytes")
@ResponseBody
public byte[] bytes() {
return "binary data".getBytes();
}
@GetMapping("/entity")
@ResponseBody
public ResponseEntity<User> entity() {
User user = userService.findById(1L);
return ResponseEntity.ok()
.header("X-Custom-Header", "value")
.body(user);
}
内容协商
根据 Accept 请求头返回不同格式:
Java
@GetMapping(value = "/user/{id}", produces = {
MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE
})
@ResponseBody
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
配置消息转换器
Java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(new ObjectMapper());
converters.add(converter);
}
}
与 ResponseEntity 对比
Java
// 使用 @ResponseBody
@GetMapping("/user/{id}")
@ResponseBody
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
// 使用 ResponseEntity
@GetMapping("/user/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
User user = userService.findById(id);
if (user == null) {
return ResponseEntity.notFound().build();
}
return ResponseEntity.ok(user);
}
@RestController = @Controller + @ResponseBody,REST API 推荐使用。
要点总结
- @ResponseBody 将返回值写入响应体
- 默认使用 Jackson 序列化为 JSON
- 类级别使用等价于 @RestController
- 可配合 ResponseEntity 返回状态码
📝 发现内容有误?点击此处直接编辑