首页 > 编程语言 >【Java】【组件使用】【Swagger2的基本使用】

【Java】【组件使用】【Swagger2的基本使用】

时间:2022-09-30 18:14:58浏览次数:49  
标签:swagger Java classpath Swagger2 registry 组件 import springfox addResourceLocation

【Java】【组件使用】【Swagger2的基本使用】

以下使用皆基于springboot项目。

一、Jar包的引入的两种方式

1.1、使用swagger官方提供的jar包

1.1.1、第一步在pom文件里引入2.9.2版本的jar包

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

注:springboot从2.6.0版本开始不支持2.9.2版本的jar包,低于此版本的才可以引入此jar包

1.1.2、第二步 添加配置文件

1.1.3、第三步 添加注解

在起始类添加注解@EnableSwagger2:

image-20220421192657636

或者在Swagger配置文件添加注解@EnableSwagger2:

注:任意一个即可,但不能不写

1.2、使用非官方封装的包(-)

这个和官方的swagger2的区别就在于,自动化配置,引入jar包和添加注解即可使用,当然,如果需要个性化操作,就需要自己在yml文件添加配置。

1.2.1、第一步 jar包引入

<!-- https://mvnrepository.com/artifact/com.spring4all/swagger-spring-boot-starter -->
<dependency>
    <groupId>com.spring4all</groupId>
    <artifactId>swagger-spring-boot-starter</artifactId>
    <version>1.9.1.RELEASE</version>
</dependency>

1.2.2、第二步 增加注解@EnableSwagger2Doc

image-20220421195649396

1.2.3、可选配置

yml格式配置:


1.2.4、界面

和原生swagger界面并无区别

1.3、使用非官方封装的包(二)

和上面一个很相似,不过在这基础上,又参考了swagger-bootstrap-ui
注:1.X 版本需要在启动类添加 `@EnableSwagger2Doc` 但是 2.X 版本后无需添加
https://gitee.com/battcn/spring-boot-starter-swagger/
<dependency>
    <groupId>com.battcn</groupId>
    <artifactId>swagger-spring-boot-starter</artifactId>
    <version>2.1.5-RELEASE</version>
</dependency>

image-20220421200459411

二、增强版-可视化界面(支持文档导出)

http://${host}:${port}/doc.html

2.1、老版的使用

2.1.1、jar包的引用

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>swagger-bootstrap-ui</artifactId>
    <version>1.9.1</version>
</dependency>

2.1.2、在配置文件或者启动类添加注解@EnableSwaggerBootstrapUI

image-20220422114611229

2.1.3、界面

image-20220422114514231

2.2、新版的使用

2.2.1、jar包的引用

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>2.0.9</version>
</dependency>

2.2.2、界面

image-20220422114733230

2.3、如果被拦截器拦截的处理方式

首先,swagger配置文件实现WebMvcConfigurer

image-20220422113637217

然后重写addResourceHandlers方法,并添加:

  registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");

示例:

   @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
        registry.addResourceHandler("/swagger/**").addResourceLocations("classpath:/static/swagger/");
        registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
    }

三、使用注意点

3.1、项目进行了反向代理时的处理

配置反射路径时并没有将context-path的路径映射,就需要这里代码:

image-20220422114949028

四、注解的使用

@Api:修饰整个类,描述Controller的作用
@ApiOperation:描述一个类的一个方法,或者说一个接口

@ApiParam:单个参数描述
@ApiModel:用对象实体来作为入参
@ApiProperty:用对象接实体收参数时,描述对象的一个字段

@ApiResponse:HTTP响应其中1个描述
@ApiResponses:HTTP响应整体描述
@ApiIgnore:使用该注解忽略这个API
@ApiError :发生错误返回的信息
@ApiImplicitParam:一个请求参数
@ApiImplicitParams: 多个请求参数

五、Swagger配置文件示例

package com.jh.plug.config;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.Profile;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.paths.RelativePathProvider;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger.web.UiConfiguration;
import springfox.documentation.swagger.web.UiConfigurationBuilder;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import javax.servlet.ServletContext;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

@EnableSwagger2
@Configuration
//Profile是方法1(只在dev和test环境下开启)
//@Profile({"dev","test"})
public class SwaggerConfig implements WebMvcConfigurer {

    @Bean("shopApi")
    public Docket createRestApi(ServletContext servletContext) {
        return new Docket(DocumentationType.SWAGGER_2)
//                .pathProvider(new RelativePathProvider(servletContext) {
//                    @Override
//                    public String getApplicationBasePath() {
//                        return "/jherp-shop-api";
//                    }
//                })
                .groupName("shop")// 不能为中文,否则termsOfServiceUrl打不开
                .consumes(DEFAULT_PRODUCES_AND_CONSUMES)
                .produces(DEFAULT_PRODUCES_AND_CONSUMES)
                .useDefaultResponseMessages(false)//不使用默认相应code
                .apiInfo(apiInfo())// 用于生成API信息
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.jh.plug"))// 用于指定扫描哪个包下的接口
                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))//为有@Api注解的Controller生成API文档

//				.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .paths(PathSelectors.any())// 选择所有的API,如果你想只为部分API生成文档,可以配置这里
                //创建
                .build();
    }

    /**
     * 用于定义API主界面的信息,比如可以声明所有的API的总标题、描述、版本
     *
     * @return
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("鲸汇平台对接项目API") //  可以用来自定义API的主标题
                .description("<p>鲸汇平台对接项目SwaggerAPI管理,主要用于测试平台接口连通性。</p>") // 可以用来描述整体的API
                .termsOfServiceUrl("") // 用于定义服务的域名
                .version("1.0") // 可以用来定义版本。
                .build(); //
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
        registry.addResourceHandler("/swagger/**").addResourceLocations("classpath:/static/swagger/");
        registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");

    }

    //配置content type
    private static final Set<String> DEFAULT_PRODUCES_AND_CONSUMES =
            new HashSet<>(Collections.singletonList("application/json"));//,"application/xml",只需要json格式

    @Bean
    public UiConfiguration uiConfiguration() {
        return UiConfigurationBuilder.builder()
                // 隐藏UI上的Models模块:-1为不显示,默认为0显示
                .defaultModelsExpandDepth(0)
                .build();
    }
}

标签:swagger,Java,classpath,Swagger2,registry,组件,import,springfox,addResourceLocation
From: https://www.cnblogs.com/simpletime/p/16745750.html

相关文章

  • JavaScript IndexedDB 完整指南
    本文将通过一个crmeb小教程向你介绍 ​​IndexedDB​​​,并将 ​​IndexedDB​​​ 与其他可用选项进行比较。​​IndexedDB​​ 用于在浏览器中存储数据,对于需要离线工......
  • SpringBoot+Vue社区团购系统 团购商城管理系统 商城购物系统Java Vue MySQL数据库 远
    ......
  • java 输出hello world 会有几个线程
    先直接说结论五个或者6个测试代码如下点击查看代码ThreadMXBeanbean=ManagementFactory.getThreadMXBean();System.out.println("helloworld:"+bean.getTh......
  • 【Java】【基础知识】【Java的基本使用】
    【Java】【基础知识】【Java的基本使用】基于jdk8仅个人理解,或有疏漏基于java疯狂讲义第三版和第四版java核心技术卷一第十版和第十一版廖雪峰java课程一、基本......
  • 获取JAVA[WEB]项目相关路径的几种方法 _
    在jsp和class文件中调用的相对路径不同。在jsp里,根目录是WebRoot;在class文件中,根目录是WebRoot/WEB-INF/classes;当然你也可以用System.getProperty("user.dir")获取你工程......
  • Java中的集合基础
    Java集合基础一、集合ArrayList概述:编程的时候如果存储多个数据,使用长度固定的数组储存格式,不一定满足我们的需求,更适应不了变化的需求,那么,此时该如何选择?......
  • Java中的字符串
    Java中的字符串一、APl(注:Java的默认包是java.lang使用时不需要导包)1、APl概述:APl(ApplicationProgrammingInterface):应用程序编程接口JavaAPl:指的就是J......
  • 小白初学java
    #Markdown#标题###三级标题####四级标题 ##字体**Hello,World!***Hello,World!****Hello,World!***~~Hello,World!~~Hello,World! ##引用>小白java......
  • Java: 压缩PDF文档
    PDF文档在日常工作中应用广泛,经常用于保存公司文件,电子图书或网络资料等大篇幅内容。然而,内容过多往往也会导致PDF文件过大,不便于其保存和发送。在这种情况下,我们可以选择使......
  • Arco Pro + Vite + vue3 + ts 动态引入组件
    有个需求是在组件中动态导入组件, 但vite自身对动态字符串形式的组件引入是有限制的, 以下写法会报错   官方文档中也对此有做说明   改为以下形式就不......