为了代码简洁,通常springboot项目都会实现org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice<T>
这个类去做统一响应处理。例如:
/**
* 统一响应结果
*/
@Data
public class Result<T> implements Serializable {
private static final long serialVersionUID = 8925927757015090232L;
/** 响应编码 */
private String code;
/** 响应消息 */
private String msg;
/** 响应数据 */
private T data;
}
/**
* 统一处理响应结果
* 处理后,不需要在Controller层的每个接口返回结果再包一层Result<T>
*/
@Slf4j
@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class converterType) {
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType,
ServerHttpRequest request, ServerHttpResponse response) {
if (body instanceof Result) {
return body;
}
return Result.success(body);
}
}
/**
* 测试实体类
*/
@Data
public class TestDTO implements Serializable {
private static final long serialVersionUID = -5026639589154791246L;
/**
* 名称
* */
private String name;
/**
* 性别
*/
private String gender;
}
@Slf4j
@Validated
@RestController
@RequestMapping("test")
public class TestController {
/**
* 测试接口
* @return 结果对象
*/
@GetMapping
public TestDTO test(){
TestDTO entity = new TestDTO();
entity.setGender("男");
return entity;
}
}
经过统一处理,接口test()最终返回结果如下:
{
"code": "00000",
"msg": "成功",
"data": {
"name": "名称",
"gender": "男"
}
}
理论上对应的接口文档响应结果字段应该是这样的:
| | | | | |
| :----- | :----- | :------- | :------- | :----------------- |
| 名称 | 类型 | 是否必须 | 备注 | 其他信息 |
| code | string | 非必须 | 响应编码 | |
| msg | string | 非必须 | 响应消息 | |
| data | object | 非必须 | 响应数据 | 备注: 响应数据 |
| name | string | 非必须 | 名称 | |
| gender | string | 非必须 | 性别 | |
但是实际只生成了如下文档:
| | | | | |
| :----- | :----- | :------- | :--- | :------- |
| 名称 | 类型 | 是否必须 | 备注 | 其他信息 |
| name | string | 非必须 | 名称 | |
| gender | string | 非必须 | 性别 | |
因此建议插件增加一个结果类型(Result)配置开关,如果开启并配置了这个Result类,当扫描接口返回结果类型时,如果类型是Result类,则直接生成文档;如果不是,则包上这一层Result类,再生成接口文档。 这样,才不会生成错误的接口文档。
question