32、请求处理-【源码分析】-各种类型参数解析原理
32、请求处理-【源码分析】-各种类型参数解析原理
在 Spring Boot 中,请求参数解析是一个核心功能,它负责将 HTTP 请求中的参数转换为控制器方法中的参数。这个过程涉及多种参数类型,包括基本类型、对象类型、集合类型等。下面通过源码分析,深入了解各种类型参数解析的原理。
### 1. 参数解析流程概述
当请求到达 `DispatcherServlet` 时,会调用 `doDispatch` 方法,核心步骤如下:
1. **获取处理器方法(HandlerMethod)**:
- 通过 `HandlerMapping` 根据请求路径找到对应的 `HandlerExecutionChain`,其中包含处理器方法。
2. **获取参数解析器(HandlerMethodArgumentResolver)**:
- 遍历 `HandlerMethodArgumentResolver` 列表,找到支持当前参数类型的解析器。
3. **解析参数**:
- 调用解析器的 `resolveArgument` 方法,将请求中的参数值转换为方法参数。
4. **执行处理器方法**:
- 使用解析后的参数调用处理器方法,获取返回值。
### 2. 不同类型参数解析原理
#### 2.1 基本类型参数
**示例**:
```java
@GetMapping("/user")
public String getUserById(@RequestParam("id") Long userId) {
// ...
}
```
**解析原理**:
- **解析器**:`RequestParamMethodArgumentResolver`
- **过程**:
- 从请求的查询参数中获取名为 `id` 的值。
- 使用 `TypeConverter` 将字符串转换为 `Long` 类型。
#### 2.2 对象类型参数
**示例**:
```java
@PostMapping("/user")
public String createUser(@RequestBody User user) {
// ...
}
public class User {
private Long id;
private String name;
// ...
}
```
**解析原理**:
- **解析器**:`RequestResponseBodyMethodProcessor`
- **过程**:
- 从请求体中读取 JSON 数据。
- 使用 `HttpMessageConverter`(如 `Jackson2HttpMessageConverter`)将 JSON 转换为 `User` 对象。
#### 2.3 集合类型参数
**示例**:
```java
@GetMapping("/users")
public String getUsers(@RequestParam("ids") List<Long> userIds) {
// ...
}
```
**解析原理**:
- **解析器**:`RequestParamMethodArgumentResolver`
- **过程**:
- 从请求的查询参数中获取名为 `ids` 的值,多个值以逗号分隔。
- 使用 `TypeConverter` 将字符串数组转换为 `List<Long>`。
#### 2.4 路径变量参数
**示例**:
```java
@GetMapping("/user/{id}")
public String getUserById(@PathVariable("id") Long userId) {
// ...
}
```
**解析原理**:
- **解析器**:`PathVariableMethodArgumentResolver`
- **过程**:
- 从请求路径中提取名为 `id` 的变量值。
- 使用 `TypeConverter` 将字符串转换为 `Long` 类型。
#### 2.5 矩阵变量参数
**示例**:
```java
@GetMapping("/cars/{path}")
public String getCars(@MatrixVariable("low") Integer lowPrice,
@MatrixVariable("brand") List<String> brands,
@PathVariable("path") String path) {
// ...
}
```
**启用矩阵变量支持**:
```java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
UrlPathHelper urlPathHelper = new UrlPathHelper();
urlPathHelper.setRemoveSemicolonContent(false);
configurer.setUrlPathHelper(urlPathHelper);
}
}
```
**解析原理**:
- **解析器**:`MatrixVariableMethodArgumentResolver`
- **过程**:
- 从请求路径的矩阵变量中提取名为 `low` 和 `brand` 的值。
- 处理多个品牌值时,自动转换为 `List<String>`。
### 3. 自定义参数解析器
如果需要支持特殊类型的参数解析,可以实现 `HandlerMethodArgumentResolver` 接口,注册到 Spring 容器中。
### 4. 总结
Spring Boot 通过多种参数解析器,支持各种类型的请求参数解析。理解其原理有助于我们更好地使用框架,并在需要时进行自定义扩展。