问题描述
在日常开发中我们会定义类似下面的 Result
类来统一接口返回结果的结构
1 2 3 4 5 6 7 8 9
| public class Result<T> implements Serializable { private static final long serialVersionUID = 1L;
private Integer code;
private String message;
private T data; }
|
此时 Controller
中的方法就会写成这个样子
1 2 3 4 5
| @GetMapping("/detail1/{userId}") public Result<User> detail1(@PathVariable(name = "userId") Long userId) { User user = .... return Result.<User>builder().data(user).build(); }
|
在每个方法上都写上类似 Result<User>
这样的代码还是比较繁琐的,我们期望写成 User
这样简单的形式
1 2 3 4 5
| @GetMapping("/detail2/{userId}") public User detail2(@PathVariable(name = "userId") Long userId) { User user = .... return user; }
|
而由框架去处理返回结果的包装。此时就会使用到 Spring 的 ResponseBodyAdvice
接口
1 2 3 4
| @RestControllerAdvice public class ResultResponseBodyAdvice implements ResponseBodyAdvice<Object> { }
|
同时我们也会使用 SpringDoc 对外提供可访问的文档。此时问题出现了,我们发现在 Swagger 的文档中方法 detail1
和方法 detail2
对应的 Schema 不一样
我们期望 detail2
展示的结果和 detail1
一样。