BUG制造02:knife4j生成在线文档,与统一返回结果冲突

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版权协议,转载请附上原文出处链接和本声明。