SpringBoot 集成Swagger2自定义访问路径

2021-09-23 0 By admin

SpringBoot 集成 Swagger2 后默认访问路径是 ip:port/swagger-ui.html, 由于系统中添加了拦截器, 非”/oss”开头的请求路径都会被拦截, 需要设置swagger的访问路径为/oss/swagger-ui.html。
SpringBoot 集成 SwaggerUI 修改访问路径,这种方式是修改SwaggerConfig, 设置default_path变量即可。

package com.graph.oss.config;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.handler.SimpleUrlHandlerMapping;
import org.springframework.web.servlet.resource.PathResourceResolver;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
import org.springframework.web.util.UrlPathHelper;
import springfox.documentation.annotations.ApiIgnore;
import springfox.documentation.spring.web.DocumentationCache;
import springfox.documentation.spring.web.json.Json;
import springfox.documentation.spring.web.json.JsonSerializer;
import springfox.documentation.swagger.web.ApiResourceController;
import springfox.documentation.swagger.web.SecurityConfiguration;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.UiConfiguration;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import springfox.documentation.swagger2.mappers.ServiceModelToSwagger2Mapper;
import springfox.documentation.swagger2.web.Swagger2Controller;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Configuration
@EnableSwagger2
public class SwaggerConfig {

  private static final String DEFAULT_PATH = "/oss";

  /**
   * SwaggerUI资源访问
   *
   * @param servletContext
   * @param order
   * @return
   * @throws Exception
   */
  @Bean
  public SimpleUrlHandlerMapping swaggerUrlHandlerMapping(ServletContext servletContext,
       @Value("${swagger.mapping.order:10}") int order) throws Exception {
    SimpleUrlHandlerMapping urlHandlerMapping = new SimpleUrlHandlerMapping();
    Map<String, ResourceHttpRequestHandler> urlMap = new HashMap<>();
    {
      PathResourceResolver pathResourceResolver = new PathResourceResolver();
      pathResourceResolver.setAllowedLocations(new ClassPathResource("META-INF/resources/webjars/"));
      pathResourceResolver.setUrlPathHelper(new UrlPathHelper());

      ResourceHttpRequestHandler resourceHttpRequestHandler = new ResourceHttpRequestHandler();
      resourceHttpRequestHandler.setLocations(Arrays.asList(new ClassPathResource("META-INF/resources/webjars/")));
      resourceHttpRequestHandler.setResourceResolvers(Arrays.asList(pathResourceResolver));
      resourceHttpRequestHandler.setServletContext(servletContext);
      resourceHttpRequestHandler.afterPropertiesSet();
      //设置新的路径
      urlMap.put(DEFAULT_PATH + "/webjars/**", resourceHttpRequestHandler);
    }
    {
      PathResourceResolver pathResourceResolver = new PathResourceResolver();
      pathResourceResolver.setAllowedLocations(new ClassPathResource("META-INF/resources/"));
      pathResourceResolver.setUrlPathHelper(new UrlPathHelper());

      ResourceHttpRequestHandler resourceHttpRequestHandler = new ResourceHttpRequestHandler();
      resourceHttpRequestHandler.setLocations(Arrays.asList(new ClassPathResource("META-INF/resources/")));
      resourceHttpRequestHandler.setResourceResolvers(Arrays.asList(pathResourceResolver));
      resourceHttpRequestHandler.setServletContext(servletContext);
      resourceHttpRequestHandler.afterPropertiesSet();
      //设置新的路径
      urlMap.put(DEFAULT_PATH + "/**", resourceHttpRequestHandler);
    }
    urlHandlerMapping.setUrlMap(urlMap);
    //调整DispatcherServlet关于SimpleUrlHandlerMapping的排序
    urlHandlerMapping.setOrder(order);
    return urlHandlerMapping;
  }

  /**
   * SwaggerUI接口访问
   */
  @Controller
  @ApiIgnore
  @RequestMapping(DEFAULT_PATH)
  public static class SwaggerResourceController implements InitializingBean {

    @Autowired
    private ApiResourceController apiResourceController;

    @Autowired
    private Environment environment;

    @Autowired
    private DocumentationCache documentationCache;

    @Autowired
    private ServiceModelToSwagger2Mapper mapper;

    @Autowired
    private JsonSerializer jsonSerializer;

    private Swagger2Controller swagger2Controller;

    @Override
    public void afterPropertiesSet() {
      swagger2Controller = new Swagger2Controller(environment, documentationCache, mapper, jsonSerializer);
    }

    /**
     * 首页
     *
     * @return
     */
//    @RequestMapping
//    public ModelAndView index() {
//      ModelAndView modelAndView = new ModelAndView("redirect:" + DEFAULT_PATH + "/swagger-ui.html");
//      return modelAndView;
//    }

    @RequestMapping("/swagger-resources/configuration/security")
    @ResponseBody
    public ResponseEntity<SecurityConfiguration> securityConfiguration() {
      return apiResourceController.securityConfiguration();
    }

    @RequestMapping("/swagger-resources/configuration/ui")
    @ResponseBody
    public ResponseEntity<UiConfiguration> uiConfiguration() {
      return apiResourceController.uiConfiguration();
    }

    @RequestMapping("/swagger-resources")
    @ResponseBody
    public ResponseEntity<List<SwaggerResource>> swaggerResources() {
      return apiResourceController.swaggerResources();
    }

    @RequestMapping(value = "/v2/api-docs", method = RequestMethod.GET, produces = {"application/json", "application/hal+json"})
    @ResponseBody
    public ResponseEntity<Json> getDocumentation(
        @RequestParam(value = "group", required = false) String swaggerGroup,
        HttpServletRequest servletRequest) {
      return swagger2Controller.getDocumentation(swaggerGroup, servletRequest);
    }
  }
}