content: package com.zzyl.config;
  
  import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
  import com.zzyl.properties.SwaggerConfigProperties;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties;
  import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
  import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
  import org.springframework.boot.actuate.endpoint.ExposableEndpoint;
  import org.springframework.boot.actuate.endpoint.web.*;
  import org.springframework.boot.actuate.endpoint.web.annotation.ControllerEndpointsSupplier;
  import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointsSupplier;
  import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping;
  import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
  import org.springframework.boot.context.properties.EnableConfigurationProperties;
  import org.springframework.context.annotation.Bean;
  import org.springframework.context.annotation.Configuration;
  import org.springframework.context.annotation.Import;
  import org.springframework.core.env.Environment;
  import org.springframework.util.StringUtils;
  import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration;
  import springfox.documentation.builders.ApiInfoBuilder;
  import springfox.documentation.builders.PathSelectors;
  import springfox.documentation.builders.RequestHandlerSelectors;
  import springfox.documentation.service.Contact;
  import springfox.documentation.spi.DocumentationType;
  import springfox.documentation.spring.web.plugins.Docket;
  
  import java.util.ArrayList;
  import java.util.Collection;
  import java.util.List;
  
  @Configuration
  @EnableConfigurationProperties(SwaggerConfigProperties.class)
  @EnableKnife4j
  @Import(BeanValidatorPluginsConfiguration.class)
  public class SwaggerConfig {
  
      @Autowired
      SwaggerConfigProperties swaggerConfigProperties;
  
      @Bean(value = "defaultApi2")
      @ConditionalOnClass(SwaggerConfigProperties.class)
      public Docket defaultApi2() {
          // 构建API文档  文档类型为swagger2
          return new Docket(DocumentationType.SWAGGER_2)
              .select()
              // 配置 api扫描路径
              .apis(RequestHandlerSelectors.basePackage(swaggerConfigProperties.getSwaggerPath()))
              // 指定路径的设置  any代表所有路径
              .paths(PathSelectors.any())
              // api的基本信息
              .build().apiInfo(new ApiInfoBuilder()
                  // api文档名称
                  .title(swaggerConfigProperties.getTitle())
                  // api文档描述
                  .description(swaggerConfigProperties.getDescription())
                  // api文档版本
                  .version("1.0") // 版本
                  // api作者信息
                  .contact(new Contact(
                      swaggerConfigProperties.getContactName(),
                      swaggerConfigProperties.getContactUrl(),
                      swaggerConfigProperties.getContactEmail()))
                  .build());
      }
  
      /**
       * 增加如下配置可解决Spring Boot 6.x 与Swagger 3.0.0 不兼容问题
       **/
      @Bean
      public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier,
                                                                           ServletEndpointsSupplier servletEndpointsSupplier,
                                                                           ControllerEndpointsSupplier controllerEndpointsSupplier,
                                                                           EndpointMediaTypes endpointMediaTypes,
                                                                           CorsEndpointProperties corsProperties,
                                                                           WebEndpointProperties webEndpointProperties,
                                                                           Environment environment) {
          List<ExposableEndpoint<?>> allEndpoints = new ArrayList();
          Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
          allEndpoints.addAll(webEndpoints);
          allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
          allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
          String basePath = webEndpointProperties.getBasePath();
          EndpointMapping endpointMapping = new EndpointMapping(basePath);
          boolean shouldRegisterLinksMapping = this.shouldRegisterLinksMapping(webEndpointProperties, environment, basePath);
          return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes, corsProperties.toCorsConfiguration(),
                  new EndpointLinksResolver(allEndpoints, basePath), shouldRegisterLinksMapping, null);
      }
      private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties, Environment environment, String basePath) {
          return webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath) || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));
      }
  }
  