Spring Boot 学习笔记:请求参数解析与返回数据处理

本文目录

前言

1 HandlerMethodArgumentResolver

1.1 AbstractNamedValueMethodArgumentResolver

1.2 AbstractMessageConverterMethodArgumentResolver

2 HandlerMethodReturnValueHandler

3 RequestResponseBodyMethodProcessor

4 HttpMessageConverter

4.1 HttpMessageConverter 与 Converter

5 相关文章


前言

在刚刚使用 Spring 的时候,经常会有些疑问:

(1)Spring 是如何帮我们把请求数据自动解析绑定到 Controller 方法入参?

(2)Spring 是如何将 Controller 返回结果处理成 Response 返回给调用方的?

(3)@RequestBody、@ResponseBody是干什么用的?

(4)HttpMessageConverter、Converter有什么关系和区别?

近期,花了一些时间进行学习和查询,粗浅的梳理了一下相关知识点,若有理解错误的地方,欢迎指点纠正,以免误导他人。

1 HandlerMethodArgumentResolver

HandlerMethodArgumentResolver 是一个策略接口,负责根据请求上下文,解析方法参数值。【翻译自源码注释】

就是通过它,Spring帮我们自动完成了请求数据到方法参数的解析、映射及绑定。

该接口有很多实现类,用于处理不同类型的参数解析绑定操作,下面简单列举两个比较常见的实现类。

1.1 AbstractNamedValueMethodArgumentResolver

AbstractNamedValueMethodArgumentResolver 是一个抽象类,给定了部分主干逻辑,其子类负责实现详细的解析绑定逻辑,如图所示,该类型 Resolver 主要用于处理 @RequestParam、@PathVariable、@RequestHeader、@RequestAttribute、@CookieValue 等注解修饰的参数,通过 URL、Headler、Session、Cookie 等请求数据中解析并绑定至方法参数。

1.2 AbstractMessageConverterMethodArgumentResolver

AbstractMessageConverterMethodArgumentResolver 也是一个抽象类,其子类不多,如图所示,该类型 Resolver 主要借助 HttpMessageConverter 对象解析请求体(Request Body)数据并绑定至方法参数。

2 HandlerMethodReturnValueHandler

HandlerMethodReturnValueHandler 是一个策略接口,负责处理请求调用结果。【翻译自源码注释】

通过它,Spring帮我们自动完成了方法返回数据到最终实际返回给调用方数据的转换。

该接口通用有很多实现类,用于处理不同类型的返回结果,例如:处理 ModelAndView 类型的返回值,处理 @ResponseBody 注解标记的方法返回值(直接写入Response Body,REST风格接口)。

3 RequestResponseBodyMethodProcessor

RequestResponseBodyMethodProcessor 是一个有些特别的类,它继承了 HandlerMethodArgumentResolver,同时,还实现了 HandlerMethodReturnValueHandler 接口,即将二者接口功能合为一体,同时提供了方法参数解析和方法返回数据处理的能力。通过源码可以发现,它支持解析的参数需要有 @RequestBody 注解,而支持处理的返回数据需要有 @ResponseBody 注解。原来,这两个注解就是被这个家伙处理的。

public class RequestResponseBodyMethodProcessor extends AbstractMessageConverterMethodProcessor {

	@Override
	public boolean supportsParameter(MethodParameter parameter) {
		return parameter.hasParameterAnnotation(RequestBody.class);
	}

	@Override
	public boolean supportsReturnType(MethodParameter returnType) {
		return (AnnotatedElementUtils.hasAnnotation(returnType.getContainingClass(), ResponseBody.class) ||
				returnType.hasMethodAnnotation(ResponseBody.class));
	}
}

4 HttpMessageConverter

HttpMessageConverter 负责HTTP请求和响应数据的转化工作。

通过 Media Type 和 目标类型(Class Type)过滤出可用的 HttpMessageConverter 对象,并用该对象进行数据转化,从而得到目标类型数据。

比较常用的是解析 Json 或 XML 格式数据至参数对象,或将返回数据解析成 Json 或 XML 格式数据并返回给调用端。

4.1 HttpMessageConverter 与 Converter

HttpMessageConverter 是从 HttpInputMessage 中的 InputStream 读取请求数据,解析并转化为目标对象。

Converter<S,T> 主要是将 S 类型的值转化为 T 类型的值,例如,字符串类型的 "true", "1", "yes" 可以转化为 boolean 类型的 true 值。

HttpMessageConverter 与 Converter 都属于转换器(从名字也可以知道),但他们的职责是有区别的,这也解释了为什么 HttpMessageConverter 也叫 Converter,但不是 Converter<S,T> 接口的实现类。

5 相关文章

《Spring Boot 学习笔记:常见注解》

《Spring Boot 学习笔记:以JSON格式返回对象》

《Spring Boot 学习笔记:Schedule》

《Spring Boot 学习笔记:MongoTemplate 移除 _class 字段》

《Spring Boot 学习笔记:启动过程方法》

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值