快速入門 swagger2.x (springboot版)

前言:
首先看一下要實現的效果:
swagger 實現效果 地址:http://swagger.stonestill.cn/swagger-ui.html
使用 java 的 通過 swagger 發佈jar包
使用 dockerfile 在服務器執行鏡像文件
使用 nginx 正向代理 進行DNS解析
github 地址: https://github.com/Holyson/java-swagger

swagger 實現效果地址:http://swagger.stonestill.cn/swagger-ui.html

github 地址: https://github.com/Holyson/java-swagger


1 、 swagger

1.1 安裝 swagger

以下所有內容均爲 Swagger2.x 版本爲前提的教程

可以在maven倉庫 獲取到 swagger 座標
在 maven倉庫中搜索:io.springfox

將前2個的座標 copy 的自己的maven工程中(增加 pom.xml 配置如下:)

swagger 核心文件

<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>

swagger -ui

<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

1.2 SwaggerConfig

一句註解,就可以開啓我們的 swagger

@EnableSwagger2 //開啓 swagger

1.2.1 配置 swagger 的 docket 實例

如下代碼,實現上面這個效果

package com.ctra.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.env.Profiles;
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.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;

@Configuration // 添加配置
@EnableSwagger2 //開啓 swagger
public class SwaggerConfig {
    @Bean
    public Docket docket1(Environment environment){
        return new Docket(DocumentationType.SWAGGER_2).groupName("docket1");
    }
    // 配置了 swagger 的 docket 實例
    @Bean
    public Docket docket(Environment environment){
        // 設置需要登錄的 swagger 環境
        Profiles profiles = Profiles.of("pro","dev");
        System.out.println(environment);
        // 獲取當前設置的環境
        boolean flag = environment.acceptsProfiles(profiles);
        System.out.println(flag);

        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("wanglei")
                .apiInfo(apiInfo())
                // enable 是否啓動 swagger,如果爲false,則 swagger不能再瀏覽器中訪問
                .enable(flag)
                .select()
                // RequestHandlerSelectors:配置要掃描接口的方式
                //  -basePackage:指定要掃描的包 ☆
                //  -any():掃描全部
                //  -none():不掃描
                //  -withClassAnnotation:掃描類上的註解,參數是一個註解的反射對象
                //  -withMethodAnnotation:掃描方法上的註解
                .apis(RequestHandlerSelectors.basePackage("com.ctra.controller"))
                // 過濾條件
                // .paths(PathSelectors.none())
                .build();
    }

    private ApiInfo apiInfo(){
        // 作者信息
        Contact contact = new Contact("wanglei", "www.baidu.com", "[email protected]");
        return  new ApiInfo(
                "王磊的API",
                "CTRA",
                "1.0",
                "urn:tos",
                contact,
                "Apache 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0",
                new ArrayList()
        );
    }
}

關於頭部的這裏配置,就不做多餘的介紹了,大家根據API配置即可

1.3 swagger 的 annotation

關於 swagger 的註解爲UI下半部分顯示

swagger 2.x 的包下所有的註解

這裏只介紹最基礎的用法,作爲拋磚引玉,讀者們可以根據實際需求使用

作用範圍 API 使用位置
協議集描述 @Api 用於controller類上
協議描述 @ApiOperation 用在controller的方法上
非對象參數集 @ApiImplicitParams 用在controller的方法上
非對象參數描述 @ApiImplicitParam 用在@ApiImplicitParams的方法裏邊
對象參數描述 @ApiParam 用在@ApiImplicitParams的方法裏邊,定義接收的參數形式
描述返回對象的意義 @ApiModel 用在返回對象類上
對象屬性 @ApiModelProperty 用在參數對象的字段上
Response集 @ApiResponses 用在controller的方法上
Response @ApiResponse 用在 @ApiResponses裏邊

1.3.1 @Api

@Api(tags = "hello接口")
@RestController
public class HelloController {
}

效果如下:

1.3.2 @ApiOperation

public class HelloController {
    @GetMapping(value = "/hello")
    @ApiOperation("hello控制類")
    public String hello() {
        return "hello";
    }
}

效果如下:


1.3.3 @ApiParam

@ApiOperation("hello2控制類")
@PostMapping(value = "/hello2")

public String hello2(@ApiParam("用戶名") String name) {
   return "hello" + name;
}

效果如下:


1.3.4 @ApiModel

@ApiModel("user實體類")
public class User {
}

效果如下:


1.3.5 @ApiModelProperty

public class User {
    @ApiModelProperty("主鍵ID")
    private int id;
    @ApiModelProperty("賬號")
    private  String name;
    @ApiModelProperty("密碼")
    private  String pwd;
}

效果如下:


1.4 swagger 的 版本(dev、prod)切換 ☆☆☆

由於在生產環境下暴露 swagger 接口是不安全的
這裏是一個方法,當然可以採用其他方式滿足生產環境下屏蔽 swagger
可以在開發階段設置 swagger的端口切換

1.4.1 配置多環境

在resources 包中創建 多個 properties 如下圖所示:

// application.properties
spring.profiles.active=dev
======================================
// application-dev.properties
server.port=8082
======================================
// application-pro.properties
server.port=8081

1.4.2 獲取當前環境

在 swagger 的 docket 實例 中 去獲取當前環境環境

    // 配置了 swagger 的 docket 實例
    @Bean
    public Docket docket(Environment environment){

        // 設置需要登錄的 swagger 環境
        Profiles profiles = Profiles.of("pro","dev");
        System.out.println(environment);
        // 獲取當前設置的環境
        boolean flag = environment.acceptsProfiles(profiles);
        System.out.println(flag);
   }

1.4.3 jar包

在生成的 jar 包會根據當前激活的環境
在發佈時要注意這點

2. 使用 dockerfile 構建 springboot 項目

後面會更新爲 docker composer 服務編排來重新發布此 swagger 的 springboot項目

新建一個腳本文件並且編輯

vim springboot_docker

在vim模式下輸入如下

FROM java:8
MAINTAINER wanglei <[email protected]>
ADD swaggerdmeo-2.2.0.RELEASE.jar app.jar
CMD java -jar app.jar
  • FROM 基於 java:8 鏡像 (如果沒有會自動下載 對應的 image)
  • MAINTAINER 指令設置生成鏡像的 Author 信息
  • ADD 複製該文件(這裏是 .jar)至鏡像中,起別名
  • CMD 當啓動容器時執行的腳本文件

創建 dockerfile 生成 image 名稱爲 app

 docker build -f springboot_docker -t app .

查看鏡像

docker image

啓動鏡像 並接口映射

docker run -id -p 8082:8082 app

3. nginx 域名解析

修改nginx配置文件
首先要確認服務器8082的端口是否開放

server {
        listen       80;   
        server_name  swagger.stonestill.cn;
        location / {
            proxy_pass http://127.0.0.1:8082;
        }
}

文中如有任何錯誤以及問題,歡迎指正,我會及時修正
希望這篇文章對您有一定的幫助
謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章