37、响应处理-【源码分析】-ReturnValueHandler原理
37、响应处理分析ReturnValueHandler原理
# **返回值处理器(`ReturnValueHandler`)原理**
在Spring MVC中,`ReturnValueHandler`负责处理控制器方法执行后的返回值,将其转换为HTTP响应。这个过程是Spring MVC响应处理的核心机制之一。
## **主要作用**
- **处理不同类型的返回值**:根据控制器方法返回值的类型,选择合适的`ReturnValueHandler`进行处理。
- **转换为HTTP响应**:将返回值转换为HTTP响应体、状态码、头部等信息,发送给客户端。
## **工作流程**
### **获取返回值处理器**
1. **遍历处理器列表**:Spring MVC维护了一个`ReturnValueHandler`列表,遍历这些处理器。
2. **判断支持类型**:调用每个处理器的`supportsReturnType`方法,判断是否支持处理当前返回值类型。
### **处理返回值**
1. **选择匹配的处理器**:找到第一个支持处理当前返回值的`ReturnValueHandler`。
2. **执行处理逻辑**:调用处理器的`handleReturnValue`方法,将返回值转换为HTTP响应。
## **关键接口和方法**
### **`ReturnValueHandler`接口**
```java
public interface ReturnValueHandler {
// 判断是否支持处理给定的返回值类型
boolean supportsReturnType(MethodParameter returnType,
Type targetType,
Class<? extends HttpMessageConverter<?>> converterType);
// 处理返回值
void handleReturnValue(@Nullable Object returnValue,
MethodParameter returnType,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest) throws Exception;
}
```
### **`supportsReturnType`方法**
- **参数说明**:
- `MethodParameter returnType`:控制器方法的返回类型信息。
- `Type targetType`:实际的目标类型,可能包含泛型信息。
- `Class<? extends HttpMessageConverter<?>> converterType`:消息转换器类型,用于处理特定媒体类型。
- **返回值**:如果处理器支持处理该返回值类型,返回`true`;否则返回`false`。
### **`handleReturnValue`方法**
- **参数说明**:
- `Object returnValue`:控制器方法返回的实际值。
- `MethodParameter returnType`:返回类型信息。
- `ModelAndViewContainer mavContainer`:用于存储模型和视图信息。
- `NativeWebRequest webRequest`:当前请求的封装对象。
- **功能**:具体处理返回值的逻辑,可能包括数据转换、视图渲染等。
## **常见实现类**
### **`ModelAndViewResolverMethodReturnValueHandler`**
- **处理类型**:`ModelAndView`对象。
- **功能**:提取模型数据和视图名称,将模型数据添加到请求属性中,解析并渲染视图。
### **`RequestResponseBodyMethodProcessor`**
- **处理类型**:带有`@ResponseBody`注解的方法返回值。
- **功能**:使用`HttpMessageConverter`将返回值转换为HTTP响应体,支持JSON、XML等格式。
### **`ViewNameMethodReturnValueHandler`**
- **处理类型**:字符串类型的视图名称。
- **功能**:将视图名称传递给视图解析器,渲染对应的视图。
## **示例**
### **控制器方法**
```java
@RestController
public class UserController {
@GetMapping("/user")
public User getUser() {
// 返回User对象,由RequestResponseBodyMethodProcessor处理
return new User("Alice", 25);
}
@GetMapping("/user/view")
public ModelAndView getUserView() {
// 返回ModelAndView对象,由ModelAndViewResolverMethodReturnValueHandler处理
ModelAndView mav = new ModelAndView("userView");
mav.addObject("user", new User("Bob", 30));
return mav;
}
}
```
### **处理过程**
- **`getUser`方法**:
- 返回类型为`User`,带有`@ResponseBody`注解。
- `RequestResponseBodyMethodProcessor`匹配并处理返回值。
- 使用`MappingJackson2HttpMessageConverter`将`User`对象转换为JSON格式的响应体。
- **`getUserView`方法**:
- 返回类型为`ModelAndView`。
- `ModelAndViewResolverMethodReturnValueHandler`匹配并处理返回值。
- 提取模型数据和视图名称,渲染`userView`视图。
## **总结**
`ReturnValueHandler`机制使Spring MVC能够灵活处理各种类型的返回值,实现与HTTP响应的转换。通过不同的实现类,开发者可以根据需要定制返回值处理逻辑,满足不同的应用场景。