SpringBoot-2.3.2集成swagger-3.0.0

1今膊、依賴

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

注:Springfox 3.0.0(包含springfox-swagger2-3.0.0)即OpenAPI 3的發(fā)布與系統(tǒng)集成
啟動項目浩姥,訪問地址:http://localhost:8080/swagger-ui/index.html

2讶请、application.yml配置

spring:
  application:
    name: springfox-swagger
server:
  port: 8080

# ===== 自定義swagger配置 ===== #
swagger:
  enable: true
  application-name: ${spring.application.name}
  application-version: 1.0
  application-description: springfox swagger 3.0整合Demo
  try-host: http://localhost:${server.port}

3、自定義swagger配置類SwaggerProperties

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @author: fjq
 * @date: 2021/2/8 11:24
 */
@Component
@ConfigurationProperties("swagger")
public class SwaggerProperties {
    /**
     * 是否開啟swagger,生產(chǎn)環(huán)境一般關(guān)閉嚷狞,所以這里定義一個變量
     */
    private Boolean enable;

    /**
     * 項目應(yīng)用名
     */
    private String applicationName;

    /**
     * 項目版本信息
     */
    private String applicationVersion;

    /**
     * 項目描述信息
     */
    private String applicationDescription;

    /**
     * 接口調(diào)試地址
     */
    private String tryHost;

    public Boolean getEnable() {
        return enable;
    }

    public void setEnable(Boolean enable) {
        this.enable = enable;
    }

    public String getApplicationName() {
        return applicationName;
    }

    public void setApplicationName(String applicationName) {
        this.applicationName = applicationName;
    }

    public String getApplicationVersion() {
        return applicationVersion;
    }

    public void setApplicationVersion(String applicationVersion) {
        this.applicationVersion = applicationVersion;
    }

    public String getApplicationDescription() {
        return applicationDescription;
    }

    public void setApplicationDescription(String applicationDescription) {
        this.applicationDescription = applicationDescription;
    }

    public String getTryHost() {
        return tryHost;
    }

    public void setTryHost(String tryHost) {
        this.tryHost = tryHost;
    }
}

4、配置類SwaggerConfiguration

import io.swagger.models.auth.In;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.springframework.boot.SpringBootVersion;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ReflectionUtils;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
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.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.Contact;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.service.SecurityScheme;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

/**
 * 基于Swagger生成API文檔
 *
 * @EnableOpenApi:啟動OpenApi的類荣堰; 之前是@EnableSwagger2
 * @author: fjq
 * @date: 2021/2/8 11:19
 */

@EnableOpenApi
@Configuration
public class SwaggerConfiguration implements WebMvcConfigurer {
    private final SwaggerProperties swaggerProperties;

    public SwaggerConfiguration(SwaggerProperties swaggerProperties) {
        this.swaggerProperties = swaggerProperties;
    }

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.OAS_30).pathMapping("/")

                // 定義是否開啟swagger感耙,false為關(guān)閉,可以通過變量控制
                .enable(swaggerProperties.getEnable())

                // 將api的元信息設(shè)置為包含在json ResourceListing響應(yīng)中持隧。
                .apiInfo(apiInfo())

                // 接口調(diào)試地址
                .host(swaggerProperties.getTryHost())

                // 選擇哪些接口作為swagger的doc發(fā)布
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build()

                // 支持的通訊協(xié)議集合
                .protocols(newHashSet("https", "http"))

                // 授權(quán)信息設(shè)置即硼,必要的header token等認(rèn)證信息
                .securitySchemes(securitySchemes())

                // 授權(quán)信息全局應(yīng)用
                .securityContexts(securityContexts());
    }

    /**
     * API 頁面上半部分展示信息
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder().title(swaggerProperties.getApplicationName() + " Api Doc")
                .description(swaggerProperties.getApplicationDescription())
                .contact(new Contact("lighter", null, "123456@gmail.com"))
                .version("Application Version: " + swaggerProperties.getApplicationVersion() + ", Spring Boot Version: " + SpringBootVersion.getVersion())
                .build();
    }

    /**
     * 設(shè)置授權(quán)信息
     */
    private List<SecurityScheme> securitySchemes() {
        ApiKey apiKey = new ApiKey("BASE_TOKEN", "token", In.HEADER.toValue());
        return Collections.singletonList(apiKey);
    }

    /**
     * 授權(quán)信息全局應(yīng)用
     */
    private List<SecurityContext> securityContexts() {
        return Collections.singletonList(
                SecurityContext.builder()
                        .securityReferences(Collections.singletonList(new SecurityReference("BASE_TOKEN", new AuthorizationScope[]{new AuthorizationScope("global", "")})))
                        .build()
        );
    }

    @SafeVarargs
    private final <T> Set<T> newHashSet(T... ts) {
        if (ts.length > 0) {
            return new LinkedHashSet<>(Arrays.asList(ts));
        }
        return null;
    }

    /**
     * 通用攔截器排除swagger設(shè)置,所有攔截器都會自動加swagger相關(guān)的資源排除信息
     */
    @SuppressWarnings("unchecked")
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        try {
            Field registrationsField = FieldUtils.getField(InterceptorRegistry.class, "registrations", true);
            List<InterceptorRegistration> registrations = (List<InterceptorRegistration>) ReflectionUtils.getField(registrationsField, registry);
            if (registrations != null) {
                for (InterceptorRegistration interceptorRegistration : registrations) {
                    interceptorRegistration
                            .excludePathPatterns("/swagger**/**")
                            .excludePathPatterns("/webjars/**")
                            .excludePathPatterns("/v3/**")
                            .excludePathPatterns("/doc.html");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

5屡拨、配置類接口ApiImplicitParam

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * swagger2
 *
 * @author: fjq
 * @date: 2021/2/8 11:17
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiImplicitParam {
    //參數(shù)名
    String name() default "";

    //參數(shù)描述
    String value() default "";

    //參數(shù)默認(rèn)值
    String defaultValue() default "";

    String allowableValues() default "";

    //是否必傳
    boolean required() default false;

    String access() default "";

    //允許多個只酥,當(dāng)傳入的參數(shù)為數(shù)組或者list時候,指定參數(shù)類型dataType()呀狼,屬性設(shè)置為true裂允;
    boolean allowMultiple() default false;

    //數(shù)據(jù)類型:這可以是類名或基礎(chǔ)類型。
    String dataType() default "";

    //數(shù)據(jù)的class類
    Class<?> dataTypeClass() default Void.class;

    /**
     * 請求參數(shù)類型:
     * path:請求參數(shù)的獲雀缤А:@PathVariable
     * query:請求參數(shù)的獲染唷:@RequestParam
     * body:@RequestBody
     * header:請求參數(shù)的獲取:@RequestHeader
     * form:表單數(shù)據(jù)
     */
    String paramType() default "";

    /**
     * a single example for non-body type parameters
     */
    String example() default "";

    //Examples for the parameter.  Applies only to BodyParameters
//    Example examples() default @Example(value = @ExampleProperty(mediaType = "", value = ""));

    //Adds the ability to override the detected type
    String type() default "";

    //Adds the ability to provide a custom format
    String format() default "";

    //Adds the ability to set a format as empty
    boolean allowEmptyValue() default false;

    //adds ability to be designated as read only.
    boolean readOnly() default false;

    //adds ability to override collectionFormat with `array` types
    String collectionFormat() default "";
}

4貌踏、main方法

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SwaggerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SwaggerApplication.class, args);
    }

}

訪問路徑:http://localhost:8080/swagger-ui/index.html#/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末十饥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子祖乳,更是在濱河造成了極大的恐慌逗堵,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眷昆,死亡現(xiàn)場離奇詭異蜒秤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)亚斋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門作媚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人帅刊,你說我怎么就攤上這事纸泡。” “怎么了厚掷?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵弟灼,是天一觀的道長级解。 經(jīng)常有香客問我,道長田绑,這世上最難降的妖魔是什么勤哗? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮掩驱,結(jié)果婚禮上芒划,老公的妹妹穿的比我還像新娘。我一直安慰自己欧穴,他們只是感情好民逼,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涮帘,像睡著了一般拼苍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上调缨,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天疮鲫,我揣著相機(jī)與錄音,去河邊找鬼弦叶。 笑死俊犯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伤哺。 我是一名探鬼主播燕侠,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼立莉!你這毒婦竟也來了绢彤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤桃序,失蹤者是張志新(化名)和其女友劉穎杖虾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體媒熊,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年坟比,在試婚紗的時候發(fā)現(xiàn)自己被綠了芦鳍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡葛账,死狀恐怖柠衅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情籍琳,我是刑警寧澤菲宴,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布贷祈,位于F島的核電站,受9級特大地震影響喝峦,放射性物質(zhì)發(fā)生泄漏势誊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一谣蠢、第九天 我趴在偏房一處隱蔽的房頂上張望粟耻。 院中可真熱鬧,春花似錦眉踱、人聲如沸挤忙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽册烈。三九已至,卻和暖如春婿禽,著一層夾襖步出監(jiān)牢的瞬間赏僧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工谈宛, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留次哈,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓吆录,卻偏偏與公主長得像窑滞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子恢筝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容