1. 程式人生 > >Spring Cloud 整合 Swagger2 以及遇到的坑

Spring Cloud 整合 Swagger2 以及遇到的坑

一、引入依賴:

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

注意了注意了知識點! 

版本一定要2.5.0以及以上版本! 網上博文大多數引的2.2.2版本的, 這個版本在demo中沒有問題, 但是開發中你肯定會引別的外掛.

2.2.2版本的與feign有衝突! 會報bean建立載入異常!  這是個坑不想網友們再遇到同樣的錯誤.

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

二、Swagger2配置檔案類:

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

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.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
* @ClassName: swagger2配置
* @Description: TODO
* @author 劉圈圈
* @date 2018年7月5日
*/

@Configuration
@EnableSwagger2
public class Swagger2 {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("io.sr.modules.tra.app"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("旅遊用車  APIs")
                .description("--------------------------------")
                .termsOfServiceUrl("https://blog.csdn.net/ityqing")
                .contact("劉圈圈")
                .version("0.1.1")
                .build();
    }

}

這個類要和啟動類放在同一個目錄下, 

用@Configuration註解該類,等價於XML中配置beans;用@Bean標註方法等價於XML中配置bean。

Application.class 加上註解@EnableSwagger2 表示開啟Swagger,也可以在配置檔案上加@EnableSwagger2

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

我的包結構:

.apis(RequestHandlerSelectors.basePackage("io.sr.modules.tra.app"))  : 是設定掃描的包路徑

io.sr.modules.tra.app 它是模糊匹配的,所以我們在建立包還有URL時要避免這種格式

result介面:

這一步不是必要的, 只要swagger掃描到@RestController註解的類就會按預設配置生成介面文件

三、controller程式碼:

@RestController
@RequestMapping("/user")
@Api(value = "Shop")
public class SpringBootController {
 
    @ApiOperation(value = "獲取helloWorld", notes = "簡單SpringMVC請求")
    @RequestMapping("/")
    String home() {
        return "HELLO WORLD";
    }
 
    @ApiOperation(value = "獲得A+B", notes = "根據url的classNo和url的studentName獲得請求引數的字串相加,RestFul風格的請求")
    @ApiImplicitParams({@ApiImplicitParam(name = "classNo", value = "班級編號", required = true, dataType = "String"),
    })
    @RequestMapping(value = "/class/{classNo}/to/{studentName}", method = RequestMethod.GET)
    String world(@PathVariable("classNo") String classNo, @PathVariable("studentName") String studentName) {
        return classNo + "  " + studentName;
    }
 
 
}

四、Swagger註解

swagger通過註解表明該介面會生成文件,包括介面名、請求方法、引數、返回資訊的等等。

  • @Api:修飾整個類,描述Controller的作用
  • @ApiOperation:描述一個類的一個方法,或者說一個介面
  • @ApiParam:單個引數描述
  • @ApiModel:用物件來接收引數
  • @ApiProperty:用物件接收引數時,描述物件的一個欄位
  • @ApiResponse:HTTP響應其中1個描述
  • @ApiResponses:HTTP響應整體描述
  • @ApiIgnore:使用該註解忽略這個API
  • @ApiError :發生錯誤返回的資訊
  • @ApiImplicitParam:一個請求引數
  • @ApiImplicitParams:多個請求引數
作用範圍 API 使用位置
物件屬性 @ApiModelProperty 用在出入引數物件的欄位上
協議集描述 @Api 用於controller類上
協議描述 @ApiOperation 用在controller的方法上
Response集 @ApiResponses 用在controller的方法上
Response @ApiResponse 用在 @ApiResponses裡邊
非物件引數集 @ApiImplicitParams 用在controller的方法上
非物件引數描述 @ApiImplicitParam 用在@ApiImplicitParams的方法裡邊
描述返回物件的意義 @ApiModel 用在返回物件類上

@RequestMapping此註解的推薦配置 
value 
method 
produces

示例:

    @ApiOperation("資訊軟刪除")
    @ApiResponses({ @ApiResponse(code = CommonStatus.OK, message = "操作成功"),
            @ApiResponse(code = CommonStatus.EXCEPTION, message = "伺服器內部異常"),
            @ApiResponse(code = CommonStatus.FORBIDDEN, message = "許可權不足") })
    @ApiImplicitParams({ @ApiImplicitParam(paramType = "query", dataType = "Long", name = "id", value = "資訊id", required = true) })
    @RequestMapping(value = "/remove.json", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public RestfulProtocol remove(Long id) {
    @ApiModelProperty(value = "標題")
    private String  title;

@ApiImplicitParam

屬性 取值 作用
paramType 查詢引數型別
path 以地址的形式提交資料
query 直接跟引數完成自動對映賦值
body 以流的形式提交 僅支援POST
header 引數在request headers 裡邊提交
form 以form表單的形式提交 僅支援POST
dataType 引數的資料型別 只作為標誌說明,並沒有實際驗證
Long
String
name 接收引數名
value 接收引數的意義描述
required 引數是否必填
true 必填
false 非必填
defaultValue 預設值

paramType 示例詳解

path

 @RequestMapping(value = "/findById1/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)

 @PathVariable(name = "id") Long id

body

  @ApiImplicitParams({ @ApiImplicitParam(paramType = "body", dataType = "MessageParam", name = "param", value = "資訊引數", required = true) })
  @RequestMapping(value = "/findById3", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)

  @RequestBody MessageParam param

  提交的引數是這個物件的一個json,然後會自動解析到對應的欄位上去,也可以通過流的形式接收當前的請求資料,但是這個和上面的接收方式僅能使用一個(用@RequestBody之後流就會關閉了)

header

  @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "Long", name = "id", value = "資訊id", required = true) }) 

   String idstr = request.getHeader("id");
        if (StringUtils.isNumeric(idstr)) {
            id = Long.parseLong(idstr);
        }

Form

@ApiImplicitParams({ @ApiImplicitParam(paramType = "form", dataType = "Long", name = "id", value = "資訊id", required = true) })
 @RequestMapping(value = "/findById5", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)