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.ModelAndView; 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.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.Contact; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.DocumentationCache; import springfox.documentation.spring.web.json.Json; import springfox.documentation.spring.web.json.JsonSerializer; import springfox.documentation.spring.web.plugins.Docket; 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.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 集成swagger2管理接口文档 * 重定向swagger2请求 */ @Configuration @EnableSwagger2 public class SwaggerConfig { /** * swagger开关 */ @Value("${swagger.show:false}") private boolean swaggerShow; @Value("${api.title}") private String apiTitle; @Value("${api.base.package}") private String apiBasePage; @Value("${api.project.doc.url}") private String apiProjectDocUrl; @Value("${api.version}") private String apiVersion; @Value("${contact.name}") private String contactName; @Value("${contact.url}") private String contactUrl; @Value("${contact.email}") private String contactEmail; @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .enable(swaggerShow) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage(apiBasePage)) .paths(PathSelectors.any()) .build(); } private ApiInfo apiInfo() { return new ApiInfo(apiTitle, apiProjectDocUrl, apiVersion, "", new Contact(contactName, contactUrl, contactEmail), "", "", Collections.emptyList()); } private static final String DEFAULT_PATH = "/swagger2"; /** * 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); } } }
<properties> <swagger2.version>2.9.2</swagger2.version> </properties> <dependencies> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger2.version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swagger2.version}</version> </dependency> <!-- 这里使用 swagger-bootstrap-ui 替代了原有丑陋的ui--> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>swagger-bootstrap-ui</artifactId> <version>1.9.6</version> </dependency> </dependencies>
swagger.show = false api.base.package = com.xx.xxx.xxxx.controller api.title = 管理系统接口文档 api.project.doc.url = https://docs.xxxx.com/pages?pageId=37647518 api.version = API V1.0 contact.name = backend-xxx contact.url = https://gitlab.xxxx.com/xxx/backend-xxx contact.email = xxx@xxxx.com
参考:
https://blog.didispace.com/springbootswagger2/
https://www.cnblogs.com/sujunyuan/p/12410264.html
https://blog.csdn.net/weixin_42260311/article/details/88661546