04.2 — 参数绑定与返回值
定位: Spring MVC 中请求参数到方法参数的转换机制,以及 Controller 返回值的处理 面试高频度: ⭐⭐⭐⭐ 考查方式: 7 种参数注解的区别、@ResponseBody + HttpMessageConverter 原理、ModelAndView
一、这是什么?为什么需要它?
Spring MVC 需要将 HTTP 请求中的各种数据(查询参数、路径片段、请求体、请求头等)自动绑定到 Controller 方法的 Java 参数上,并将方法的返回值转换为 HTTP 响应。这套机制让开发者专注于业务逻辑,无需手动解析 HTTP 报文。
二、原理拆解
2.1 参数绑定注解
| 注解 | 绑定来源 | 使用场景 |
|---|---|---|
@RequestParam | 查询参数/表单参数 | ?name=xxx |
@PathVariable | URL 路径片段 | /users/{id} |
@RequestBody | 请求体(JSON/XML) | POST/PUT 请求体 |
@ModelAttribute | 请求参数绑定到模型对象 | 表单提交,也用于数据准备 |
@RequestHeader | HTTP 请求头 | Authorization、Accept |
@CookieValue | Cookie | 会话 ID |
@RequestAttribute | 请求作用域属性 | 由拦截器/过滤器设置 |
2.2 参数绑定示例
java
@RestController
@RequestMapping("/api")
public class DemoController {
@GetMapping("/users")
public Result listUsers(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "20") int size,
@RequestHeader("Authorization") String token) {
// 查询参数 + 请求头
return Result.ok();
}
@PostMapping("/users")
public User createUser(@Valid @RequestBody UserCreateRequest request) {
// @Valid 触发 JSR-303 Bean Validation
return userService.create(request);
}
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
}2.3 @ResponseBody 机制
2.4 HttpMessageConverter 链
Spring Boot 默认注册的 Converter 链(按优先级):
ByteArrayHttpMessageConverter— 字节数组StringHttpMessageConverter— 字符串ResourceHttpMessageConverter— 资源文件ResourceRegionHttpMessageConverter— 资源分片MappingJackson2HttpMessageConverter— Jackson JSON(有 jackson 依赖时)MappingJackson2XmlHttpMessageConverter— Jackson XML(有 jackson-xml 时)
2.5 ModelAndView
java
@Controller // 注意不是 @RestController
public class ViewController {
@GetMapping("/hello")
public ModelAndView hello() {
ModelAndView mv = new ModelAndView("hello"); // 视图名 → hello.html / hello.jsp
mv.addObject("message", "Hello, World!");
return mv;
}
}
@RestController=@Controller+@ResponseBody,每个方法默认带有@ResponseBody。
三、面试视角
| 追问 | 答案要点 |
|---|---|
| @RequestParam 和 @PathVariable 的区别? | @RequestParam 绑定查询参数,@PathVariable 绑定 URL 路径片段 |
| @ResponseBody 底层原理? | 通过 HttpMessageConverter 将 Java 对象序列化为 JSON/XML 写入响应体 |
| HttpMessageConverter 的工作原理? | 遍历 Converter 链,根据 MediaType 匹配,调用 write() 方法 |
| @RestController 和 @Controller 的区别? | @RestController = @Controller + @ResponseBody,每个方法默认返回 JSON/XML |
📚 相关链接
- **DispatcherServlet 流程** — 参数绑定发生的上下文
- **拦截器与异常处理** — 返回值处理中的异常场景
- ← 返回 **返回 Spring MVC 索引**