一.问题描述
今天我在搭框架的时候看到了一个可以帮忙自动统一返回格式的插件,我心想这个好用啊,我就直接放入了我现在项目的框架中,心想美滋滋,后面我又引入了swagger,自动生成接口文档,这省了好多工作量,但是配置swagger后请求默认地址/swagger-ui.html时一直报错,一直弹框显示无法访问,就像下图这样
二.解决方式
先来说下graceful-response这个插件,他是扫描所有的接口返回变成他规定的json的格式,就是这样
{
"status": {
"code": "0",
"msg": "ok"
},
"payload": {
}
}
swagger请求连接本身是根据配置的swagger对象,将这个对象通过json格式返回,通过页面渲染出来的,swagger需要的格式是这样的
{
"swagger": "2.0",
"info": {
"description": "",
"version": "1.0.0",
"title": "",
"termsOfService": "Terms of service",
"contact": {
"name": "name"
},
"license": {
}
},
"host": "localhost:8080",
"basePath": "/drone"
}
所以本来要返回成这个格式的swagger的json,被graceful-response变成了这样
{
"status": {
"code": "0",
"msg": "ok"
},
"payload": {
"swagger": "2.0",
"info": {
"description": "",
"version": "1.0.0",
"title": "",
"termsOfService": "Terms of service",
"contact": {
"name": "name"
},
"license": {
}
},
"host": "localhost:8080",
"basePath": "/drone"
}
}
所以加载不出来swagger在线文档页面。
好的原因找到了,怎么解决呢?
查看graceful-response官方文档找到答案(https://doc.feiniaojin.com/graceful-response/home.html):
在从 3.2.0版本开始,提供了两种方式实现controller方法例外排除。
2.1单个方法例外排除
针对某个Controller方法,我们可以添加@ExcludeFromGracefulResponse注解,声明该方法不需要进行统一的包装。
/**
* @author lihao3
* @date 2023/6/30 10:10
*/
@Api("用户相关接口")
@Slf4j
@RestController
@RequestMapping("system/user")
@RequiredArgsConstructor
public class SysUserController {
private final SysUserService service;
@ApiOperation("删除")
@DeleteMapping("{id}")
@ExcludeFromGracefulResponse
public String delete(@PathVariable Long id) {
service.delete(id);
return "删除成功";
}
}
这样配置就会直接返回"删除成功",不再进行统一返回值的封装。
2.2 包级别的例外处理
用户可以通过配置graceful-response.exclude-packages
,声明某些包需要跳过不进行处理。
该配置项支持*和**,例如
graceful-response:
exclude-packages:
- com.lizhiadmin.pro.module.*
该配置表明com.lizhiadmin.pro.module包下的所有controller均不会被Graceful Response进行自动处理。
这里我们采用第二种方式在配置文件中加入
graceful-response:
exclude-packages:
- springfox.**
重启服务发现已经可以访问swagger文档啦。如果还不可以访问的话就需要看看你的swagger是否配置正确啦
以上是我解决这个问题的过程,希望可以帮到你,我是一个天天写bug的程序员,一起成长进步吧!