Skip to content

04.2 — 参数绑定与返回值

定位: Spring MVC 中请求参数到方法参数的转换机制,以及 Controller 返回值的处理 面试高频度: ⭐⭐⭐⭐ 考查方式: 7 种参数注解的区别、@ResponseBody + HttpMessageConverter 原理、ModelAndView

一、这是什么?为什么需要它?

Spring MVC 需要将 HTTP 请求中的各种数据(查询参数、路径片段、请求体、请求头等)自动绑定到 Controller 方法的 Java 参数上,并将方法的返回值转换为 HTTP 响应。这套机制让开发者专注于业务逻辑,无需手动解析 HTTP 报文。

二、原理拆解

2.1 参数绑定注解

注解绑定来源使用场景
@RequestParam查询参数/表单参数?name=xxx
@PathVariableURL 路径片段/users/{id}
@RequestBody请求体(JSON/XML)POST/PUT 请求体
@ModelAttribute请求参数绑定到模型对象表单提交,也用于数据准备
@RequestHeaderHTTP 请求头AuthorizationAccept
@CookieValueCookie会话 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 链(按优先级):

  1. ByteArrayHttpMessageConverter — 字节数组
  2. StringHttpMessageConverter — 字符串
  3. ResourceHttpMessageConverter — 资源文件
  4. ResourceRegionHttpMessageConverter — 资源分片
  5. MappingJackson2HttpMessageConverterJackson JSON(有 jackson 依赖时)
  6. 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 索引**

Knowledge4J — Java 知识库