Springboot整合Swagger2

試用了swagger3仪糖,對springboot版本要求高不說听绳,還是存在一些問題的醒叁,況且感覺swagger2用著還可以灾炭,就用swagger2吧夫植!
springboot整合swagger2三步曲:導(dǎo)包讹剔、配置、使用

1. 導(dǎo)包

<!--引入swagger -->
<!-- 排除springfox-swagger2 引入的swagger-annotations详民、swagger-models 1.5.20版本延欠,手動引入1.5.21版本的jar。
因為在使用@ApiModelProperty注解在字段上時沈跨,如果字段的類型為Long或是int類型由捎, 那么程序啟動后,訪問swagger-ui.html的頁面饿凛,
程序會報錯: java.lang.NumberFormatException: For input string: "" -->
      <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
            <exclusions>
                <exclusion>
                    <groupId>io.swagger</groupId>
                    <artifactId>swagger-annotations</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.swagger</groupId>
                    <artifactId>swagger-models</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-annotations</artifactId>
            <version>1.5.21</version>
        </dependency>
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-models</artifactId>
            <version>1.5.21</version>
        </dependency>

2. 添加配置

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//import org.springframework.context.annotation.Profile;

import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;

import cn.hutool.core.util.StrUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    
    // 定義分隔符,配置Swagger多包
    private static final String splitor = ";";
    
    @Bean
    public Docket api() {
        
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                // 指定掃描1個包
//                .apis(RequestHandlerSelectors.basePackage("com.test.controller"))
                // 掃描多包
                .apis(scanBasePackage("com.test.controller"))
                // 只有標記了@Api的類方法才會暴露出給swagger
                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
                // 只有標記了@ApiOperation的方法才會暴露出給swagger
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .build()
                .apiInfo(apiInfo());
    }
    
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("接口文檔")
//                .description("Demo接口測試")
                .version("1.0.0-SNAPSHOT")
//                .termsOfServiceUrl("")
                .build();
    }
    
    
    
    /**
     * 方法1:重寫basePackage方法狞玛,使能夠?qū)崿F(xiàn)多包訪問
     */
     public static Predicate<RequestHandler> basePackage(final String basePackage) {
         return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true);
     }

     private static Function<Class<?>, Boolean> handlerPackage(final String basePackage)     {
         return input -> {
             // 循環(huán)判斷匹配
             for (String strPackage : basePackage.split(splitor)) {
                 boolean isMatch = input.getPackage().getName().startsWith(strPackage);
                 if (isMatch) {
                     return true;
                 }
             }
             return false;
         };
     }

     @SuppressWarnings("deprecation")
    private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
         return Optional.fromNullable(input.declaringClass());
     }
     
     /**
      * 方法2:切割掃描的包生成Predicate<RequestHandler>
      */
    public static Predicate<RequestHandler> scanBasePackage(final String basePackage) {
        if(StrUtil.isBlank(basePackage)){
            throw new NullPointerException("basePackage不能為空,多個包掃描使用" + splitor + "分隔");
        }
        String[] controllerPack = basePackage.split(splitor);
        Predicate<RequestHandler> predicate = null;
        for (int i = controllerPack.length -1; i >= 0 ; i--) {
            String strBasePackage = controllerPack[i];
            if (StrUtil.isNotBlank(strBasePackage)) {
                Predicate<RequestHandler> tempPredicate = RequestHandlerSelectors.basePackage(strBasePackage);
                predicate = predicate == null ? tempPredicate : Predicates.or(tempPredicate,predicate);
            }
        }
        if(predicate == null) {
            throw new NullPointerException("basePackage配置不正確涧窒,多個包掃描使用" + splitor + "分隔");
        }
        return predicate;
    }
}

3. 使用

swagger2使用
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末心肪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纠吴,更是在濱河造成了極大的恐慌硬鞍,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戴已,死亡現(xiàn)場離奇詭異固该,居然都是意外死亡,警方通過查閱死者的電腦和手機糖儡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門蹬音,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人休玩,你說我怎么就攤上這事著淆。” “怎么了拴疤?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵永部,是天一觀的道長。 經(jīng)常有香客問我呐矾,道長苔埋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任蜒犯,我火速辦了婚禮组橄,結(jié)果婚禮上荞膘,老公的妹妹穿的比我還像新娘。我一直安慰自己玉工,他們只是感情好羽资,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遵班,像睡著了一般屠升。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狭郑,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天腹暖,我揣著相機與錄音,去河邊找鬼翰萨。 笑死脏答,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的亩鬼。 我是一名探鬼主播殖告,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辛孵!你這毒婦竟也來了丛肮?” 一聲冷哼從身側(cè)響起赡磅,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤魄缚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后焚廊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冶匹,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年咆瘟,在試婚紗的時候發(fā)現(xiàn)自己被綠了嚼隘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡袒餐,死狀恐怖飞蛹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灸眼,我是刑警寧澤卧檐,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站焰宣,受9級特大地震影響霉囚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匕积,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一盈罐、第九天 我趴在偏房一處隱蔽的房頂上張望榜跌。 院中可真熱鬧,春花似錦盅粪、人聲如沸钓葫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓤逼。三九已至,卻和暖如春库物,著一層夾襖步出監(jiān)牢的瞬間霸旗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工戚揭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诱告,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓民晒,卻偏偏與公主長得像精居,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子潜必,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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