BUG制造02:knife4j生成在线文档,与统一返回结果冲突
起末:原本只是无聊做个测试,没想到,踩个坑,贴出来,避个雷!
一、先出现接口文档的配置
pom中引入knife4j的依赖,别问为啥版本这么高,问就是俺乐意。
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
加入下面这段就能开启你的api文档之旅了,
@Configuration
public class Knife4jConfig {
@Bean
public Docket defaultApi2() {
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.apiInfo(new ApiInfoBuilder()
.title("Bk接口文档")
.description("Api接口文档")
.termsOfServiceUrl("http://www.bkblog.com")
.license("123456")
.contact(new Contact("sgu","http://localhost:19999/doc.html","sgu213078@gmail.com"))
.version("2.0")
.build()
).groupName("2.0RELEASE")
.select()
.apis(RequestHandlerSelectors.basePackage("com.bk.controller"))
.paths(PathSelectors.any())
.build();
return docket;
}
}
到目前为止,一切都是蛮正常的
二、进行返回值的统一封装
@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {
@Resource
private ObjectMapper objectMapper;
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
@SneakyThrows
@Override
public Object beforeBodyWrite(Object obj, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
if (obj instanceof String) {
return objectMapper.writeValueAsString(Result.success(obj));
}
if (obj instanceof Result) {
return obj;
}
return Result.success(obj);
}
}
走到这步,也是没问题的。
那么问题在那里呢?
问题就在于,添加返回结果处理后,你发现,你的接口文档访问不到了!
惊不惊喜?意不意外?开不开心?
当时我就愣住了,什么鬼,这不是逗我玩呢!
然后在网上看关于这个问题的处理,嘿嘿,没想到,踩坑的人不少,嘿嘿嘿嘿,就是发现他们给的结果,我用了,不行…
然后我就去官方文档中去看关于这类的信息解决。
官方文档地址
https://xiaoym.gitee.io/knife4j/faq/knife4j-exception.html
我看了下,我这边的请求返回,坏了,果然,这个接口的结果被封装了。
这下不就简单多了,统一返回结果的时候,将这接口请求的过滤掉,不进行封装不就妥了
三、修改统一返回处理
@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {
private static final String[] exclude = {"ApiResourceController", "Swagger2ControllerWebMvc"};
@Resource
private ObjectMapper objectMapper;
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
return true;
}
@SneakyThrows
@Override
public Object beforeBodyWrite(Object obj, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
if (Arrays.asList(exclude).contains(methodParameter.getDeclaringClass().getSimpleName())) {
return obj;
}
if (obj instanceof String) {
return objectMapper.writeValueAsString(Result.success(obj));
}
if (obj instanceof Result) {
return obj;
}
return Result.success(obj);
}
}
就这样,就可以正常访问了
版权声明:本文为qq_43362457原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。