美文网首页
Spring Boot 2 集成 Swagger2

Spring Boot 2 集成 Swagger2

作者: tickstep | 来源:发表于2020-11-23 16:24 被阅读0次

    1 简介

    Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新 。接口的方法,参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger 让部署管理和使用功能强大的API从未如此简单。

    2 pom文件添加Swagger2依赖

        <properties>
            <java.version>1.8</java.version>
            <swagger2.version>2.9.2</swagger2.version>
        </properties>
        
        <!--swagger2 相关依赖-->
            <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>
    

    3 创建Swagger2配置类

    swagger配置类建议放在和application.java启动类在同一个包里面,这样会被自动扫描到。

    @Configuration
    @EnableSwagger2
    public class SwaggerConfig {
    
        /**
         * 初始化创建Swagger Api
         */
        @Bean
        public Docket createRestApi() {
            return new Docket(DocumentationType.SWAGGER_2)
                    // 详细信息定制
                    .apiInfo(apiInfo())
                    .select()
                    // 指定当前包路径
                    .apis(RequestHandlerSelectors.basePackage("com.tickstep.demo"))
                    // 只扫描有注解的api,用这种方式更灵活//.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                    // 扫描所有 .apis(RequestHandlerSelectors.any())
                    .paths(PathSelectors.any())
                    .build();
        }
    
        /**
         * 添加摘要信息
         */
        private ApiInfo apiInfo() {
            // 用ApiInfoBuilder进行定制
            return new ApiInfoBuilder()
                    .title("Spring boot 集成 Swagger2 API工具测试")
                    .description("本接口文档是从代码自动构建而来,如果接口有更改请更新后台")
                    .contact(new Contact("多啦E梦的博客", null, null))
                    .version("0.0.1")
                    .build();
        }
    }
    

    启动application,然后直接访问 http://localhost:8280/swagger-ui.html 即可查看swagger自动生成的api接口文档

    4 更改Swagger访问路径

    Swagger默认是访问路径是/swagger-ui.html,但有时候我们需要更改这个接口访问路径,以方便对后台URL接口的统一管理。
    打开 springfox-swagger-ui.jar 包,我们可以看出swagger web 端UI的资源全部在这里面


    springfox-swagger-ui.jar

    这样思路就简单了,可以采取两种方法
    1,我们可以把这个里面的资源全部拷贝到我们的resources目录,然后更改对应的路径映射即可(可能有些资源文件也需要改一下)
    2,我们直接写个ModelAndView接口进行内部重定向

    第2种方式侵入性低,我们选用这种
    直接在SwaggerConfig.java文件增加以下代码

    
    @Configuration
    @EnableSwagger2
    public class SwaggerConfig {
    
        // 指定文档访问URL路径
        // 例如指定以下路径,则通过这个URL访问:http://localhost:8280/actuator/swagger/swagger-ui.html
        private static final String DEFAULT_PATH = "/actuator/swagger";
    
        /**
         * SwaggerUI资源访问
         */
        @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<>();
    
            // webjars
            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);
    
            // resources
            PathResourceResolver pathResourceResolverOfRes = new PathResourceResolver();
            pathResourceResolverOfRes.setAllowedLocations(new ClassPathResource("META-INF/resources/"));
    //            pathResourceResolver.setUrlPathHelper(new UrlPathHelper());
            ResourceHttpRequestHandler resourceHttpRequestHandlerOfRes = new ResourceHttpRequestHandler();
            resourceHttpRequestHandlerOfRes.setLocations(Arrays.asList(new ClassPathResource("META-INF/resources/")));
            resourceHttpRequestHandlerOfRes.setResourceResolvers(Arrays.asList(pathResourceResolverOfRes));
            resourceHttpRequestHandlerOfRes.setServletContext(servletContext);
            resourceHttpRequestHandlerOfRes.afterPropertiesSet();
            //设置新的路径
            urlMap.put(DEFAULT_PATH + "/**", resourceHttpRequestHandlerOfRes);
    
            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);
            }
    
            /**
             * 首页
             */
            @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);
            }
        }
    }
    

    直接更改这个路径配置即可更改swagger的访问路径

    private static final String DEFAULT_PATH = "/actuator/swagger";
    

    重新运行application,然后接口访问
    http://localhost:8280/actuator/swagger/swagger-ui.html

    swagger ui

    5 集成上传File文件接口

    我们Controller上备注接口描述的时候,file比较特殊。需要按照以下规则进行备注。
    dataType是"__file"类型:

     @PostMapping("/fileUpload")
        @ApiImplicitParams({@ApiImplicitParam(paramType = "form", dataType="__file", name = "file",
                value = "材料文件啊", required = false)})
        public String fileUpload(MeterialUploadForm form) {
            return form.getFile() == null ? "file is null" : form.getFile().getOriginalFilename();
        }
    

    6 资源

    代码示例请访问:https://gitlab.com/feny-blog/springboot-integrate-swagger.git

    相关文章

      网友评论

          本文标题:Spring Boot 2 集成 Swagger2

          本文链接:https://www.haomeiwen.com/subject/ggrviktx.html