请阐述 Spring MVC 中 @RequestBody 与 @ResponseBody 两个注解各自的核心功能,并说明它们通常应用于哪些场景。
考察说明
考查对 Spring MVC 请求响应绑定机制的理解,以及注解在消息转换流程中的作用。
回答思路
- 【回答框架 1】@RequestBody 用于将 HTTP 请求体内容绑定到控制器方法的参数上,其核心机制是通过 HttpMessageConverter 将请求体中的 JSON、XML 等格式数据反序列化为 Java 对象,通常在 POST、PUT 等请求中接收客户端提交的数据。
- 【回答框架 2】@ResponseBody 用于将控制器方法的返回值直接写入 HTTP 响应体,通过 HttpMessageConverter 将 Java 对象序列化为 JSON、XML 等格式,从而替代传统的 ModelAndView 视图解析,常用于返回 JSON 数据给前端。
- 【回答框架 3】两者常配合使用,形成请求数据自动映射为对象、响应对象自动转换为 JSON 的 RESTful API 模式。需要注意的是,@RequestBody 只能用于方法参数,且每个方法只能有一个;@ResponseBody 则可用于方法或类上,类上加注表示所有方法都返回响应体。
- 【回答框架 4】底层依赖 Spring MVC 的 HandlerAdapter 和消息转换器链。若缺少合适的转换器或未配置 Jackson 等库,可能导致 UnsupportedMediaTypeException 或 HttpMessageNotReadableException。
- 【关键点 1】@RequestBody 反序列化请求体到参数,依赖 HttpMessageConverter。
- 【关键点 2】@ResponseBody 将返回值序列化到响应体,可作用于类或方法。
- 【关键点 3】两者常用于 RESTful API,配合 Jackson 处理 JSON。
- 【关键点 4】每个控制器方法仅能有一个 @RequestBody 参数。
- 【易错点 1】若未配置 JSON 序列化库,@ResponseBody 无法返回 JSON,而可能返回默认视图或报错。
- 【易错点 2】@RequestBody 只能用于 POST、PUT 等携带请求体的请求,GET 请求无请求体,使用会报错。