Spring Boot整合Knife4j-3.0.3

2024-06-15 1971阅读

文章目录

  • Spring Boot整合Knife4j-3.0.3
    • 1. 引言
    • 2. 快捷的解决方案
      • 2.1 修改knife4j的依赖
      • 2.2 application.yml增加配置
      • 3.3 `SwaggerConfig`配置如下

        Spring Boot整合Knife4j-3.0.3

        1. 引言

        前面我写过一篇关于整合knife4j的文档 Spring Boot整合Knife4j-2.0.7

        Spring Boot整合Knife4j-3.0.3
        (图片来源网络,侵删)

        最近我引入redission的时候莫名其妙的抛出异常:

        Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
        

        原因:

        springboot的版本和Springfox-Swagge的版本不兼容

        2. 快捷的解决方案

        2.1 修改knife4j的依赖

        knife4j依赖

            com.github.xiaoymin
            knife4j-spring-boot-starter
            3.0.3
        
        

        springboot版本

            org.springframework.boot
            spring-boot-starter-parent
            2.7.5
        
        

        2.2 application.yml增加配置

        spring:
          mvc:
            pathmatch:
              matching-strategy: ANT_PATH_MATCHER
        

        这个不能少,否则接口html页面显示不出来

        3.3 SwaggerConfig配置如下

        package com.jiayuan.common.config;
        import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
        import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver;
        import com.jiayuan.common.constant.Constant;
        import io.swagger.annotations.ApiOperation;
        import lombok.AllArgsConstructor;
        import org.springframework.beans.BeansException;
        import org.springframework.beans.factory.config.BeanPostProcessor;
        import org.springframework.context.annotation.Bean;
        import org.springframework.context.annotation.Configuration;
        import org.springframework.util.ReflectionUtils;
        import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
        import springfox.documentation.builders.ApiInfoBuilder;
        import springfox.documentation.builders.PathSelectors;
        import springfox.documentation.builders.RequestHandlerSelectors;
        import springfox.documentation.service.ApiInfo;
        import springfox.documentation.service.ApiKey;
        import springfox.documentation.service.SecurityScheme;
        import springfox.documentation.spi.DocumentationType;
        import springfox.documentation.spring.web.plugins.Docket;
        import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;
        import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
        import springfox.documentation.swagger2.annotations.EnableSwagger2;
        import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
        import java.lang.reflect.Field;
        import java.util.List;
        import java.util.stream.Collectors;
        import static com.google.common.collect.Lists.newArrayList;
        /**
         * Swagger配置
         *
         * @author xmc
         */
        @Configuration
        @EnableSwagger2
        @AllArgsConstructor
        @EnableKnife4j
        public class SwaggerConfig {
            private final OpenApiExtensionResolver openApiExtensionResolver;
            @Bean
            public Docket createRestApi() {
                return new Docket(DocumentationType.SWAGGER_2)
                        .apiInfo(apiInfo())
                        .select()
                        //加了ApiOperation注解的类,生成接口文档
                        .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                        //包下的类,生成接口文档
                        //.apis(RequestHandlerSelectors.basePackage("com.jiayuan.modules.job.controller"))
                        .paths(PathSelectors.any())
                        .build()
                        .extensions(openApiExtensionResolver.buildExtensions("criticalVal-management-system"))
                        .directModelSubstitute(java.util.Date.class, String.class)
                        .securitySchemes(security());
            }
            private ApiInfo apiInfo() {
                return new ApiInfoBuilder()
                        .title("危急值管理系统")
                        .description("cvms-api文档")
                        .version("1.0")
                        .build();
            }
            private List security() {
                return newArrayList(
                        new ApiKey(Constant.TOKEN_HEADER, Constant.TOKEN_HEADER, "header")
                );
            }
            @Bean
            public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
                return new BeanPostProcessor() {
                    @Override
                    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                        if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
                            customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
                        }
                        return bean;
                    }
                    private  void customizeSpringfoxHandlerMappings(List mappings) {
                        List copy = mappings.stream()
                                .filter(mapping -> mapping.getPatternParser() == null)
                                .collect(Collectors.toList());
                        mappings.clear();
                        mappings.addAll(copy);
                    }
                    @SuppressWarnings("unchecked")
                    private List getHandlerMappings(Object bean) {
                        try {
                            Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
                            field.setAccessible(true);
                            return (List) field.get(bean);
                        } catch (IllegalArgumentException | IllegalAccessException e) {
                            throw new IllegalStateException(e);
                        }
                    }
                };
            }
        }
        
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]