一、返回值格式统一
1.1 返回值介绍
- 在使用controller对外提供服务的时候,很多时候都需要统一返回值格式,例如
1 | json复制代码{ |
- 如果不使用全局统一返回,就需要写一个工具类,然后controller返回对应的对象
1 | java复制代码@Data |
1 | java复制代码@RequestMapping("/foo") |
- 除了上述方法,可以对返回值进行统一处理,不需要对所有controller都使用一个返回值,controller只需要返回原始值,处理器会对返回值进行封装
- 同时也可以添加自定义注解,此注解用于忽略返回值封装,按照controller原始值返回
1.2 基础类功能
- org.springframework.web.method.support.HandlerMethodReturnValueHandler
- 使用不同策略处理从调用处理程序方法的返回值
- 策略处理顶层接口,自定义返回值格式需要实现此接口
- supportsReturnType:设置支持返回值类型
- handleReturnValue:处理返回值基础参数
- org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
- 请求映射处理适配,包含了参数、返回值处理器等信息
- HandlerMethodReturnValueHandlerComposite内部维护了HandlerMethodReturnValueHandler列表
)
- 可以自定义注解,用于类或者方法级别忽略返回值封装
1 | java复制代码@Target({ElementType.TYPE, ElementType.METHOD}) |
- org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor
- 属于HandlerMethodReturnValueHandler子类
- 主要功能是对请求和响应体的做处理的方法
- 所有属于RequestResponseBodyMethodProcessor的子类都需要替换为自定义返回值处理
- 实现原理就是,在bean初始化的时候,获取到所有处理器数组,然后将所有是RequestResponseBodyMethodProcessor处理器子类对返回值处理的过程替换为自定义处理器处理
- 这样当调用对应返回值处理器时,将会使用到自定义的返回值处理器,也就是所有返回值都会按照规定的进行处理
1.3 基础实现
- 创建普通springboot项目,项目创建在此不做说明
- 创建类实现HandlerMethodReturnValueHandler接口,主要用于实现自定义返回值内容,不需要注入容器
1 | java复制代码import com.codecoord.unifyreturn.annotation.IgnoreResponseWrapper; |
- 创建类实现InitializingBean,在初始化时调用,需要注入到容器中,否则Spring无法管理
1 | java复制代码import java.util.ArrayList; |
- 创建controller信息,例如此处map不需要封装,按照原来格式响应
1 | java复制代码@RestController |
1.4 测试信息
- 测试json(有封装)
1 | json复制代码{ |
- 测试map(无封装)
1 | json复制代码{ |
- 别的方法测试一样
二、附录说明
- 项目结构参考红框部分,别的忽略
- 除了对返回值进行全局统一,也可以对异常进行全局处理和按照统一格式返回
本文转载自: 掘金