天天看點

springboot整合knife4jspringboot整合knife4j

springboot整合knife4j

簡介

官網位址:knife4j

Knife4j的前身是swagger-bootstrap-ui,前身swagger-bootstrap-ui是一個純swagger-ui的ui皮膚項目。

一開始項目初衷是為了寫一個增強版本的swagger的前端ui,但是随着項目的發展,面對越來越多的個性化需求,不得不編寫後端Java代碼以滿足新的需求,在swagger-bootstrap-ui的1.8.5~1.9.6版本之間,采用的是後端Java代碼和Ui都混合在一個Jar包裡面的方式提供給開發者使用.這種方式雖說對于內建swagger來說很友善,隻需要引入jar包即可,但是在微服務架構下顯得有些臃腫。

是以,項目正式更名為knife4j,取名knife4j是希望她能像一把匕首一樣小巧,輕量,并且功能強悍,更名也是希望把她做成一個為Swagger接口文檔服務的通用性解決方案,不僅僅隻是專注于前端Ui前端.

後端Java代碼和ui包分離為多個子產品的jar包,以面對在目前微服務架構下,更加友善的使用增強文檔注解(使用SpringCloud微服務項目,隻需要在網關層內建UI的jar包即可,是以分離前後端)。

依賴

<!-- 整合knife4j -->
		<dependency>
			<groupId>com.github.xiaoymin</groupId>
			<artifactId>knife4j-spring-boot-starter</artifactId>
			<version>2.0.8</version>
		</dependency>
           

配置類

//通過配置類整合Swagger2  
@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfiguration {
 /*引入Knife4j提供的擴充類*/
	@Autowired
	private OpenApiExtensionResolver openApiExtensionResolver;

	@Bean("swagger2ConfigDefault")
	public Docket swagger2ConfigDefault() {
		Docket docket = new Docket(DocumentationType.SWAGGER_2);  //選擇swagger類型
		docket.apiInfo(getApiInfo("我的swaggerDefault", "Default接口文檔"))
		.groupName("default")
		.select()  //  選擇器
		.apis(RequestHandlerSelectors.basePackage("com.conformity.general.controller"))  //  掃描指定包下所有注解
		.paths(PathSelectors.any())  //  指定路徑範圍   這裡表示所有路徑
		.build()		  //  建構swagger文檔對象
		.extensions(openApiExtensionResolver.buildSettingExtensions());
		return docket;
	}
	@Bean("swagger2ConfigCommon")
	public Docket swagger2ConfigCommon() {
		Docket docket = new Docket(DocumentationType.SWAGGER_2);  //選擇swagger類型
		docket.apiInfo(getApiInfo("我的swaggerCommon", "Common接口文檔"))
		.groupName("Common")
		.select()  //  選擇器
		.apis(RequestHandlerSelectors.basePackage("com.conformity.general.controller"))  //  掃描指定包下所有注解
		.paths(PathSelectors.any())  //  指定路徑範圍   這裡表示所有路徑
		.build()					//  建構swagger文檔對象
		.extensions(openApiExtensionResolver.buildSettingExtensions());
		return docket;
	}

	private ApiInfo getApiInfo(String title,String description) {
		return new ApiInfoBuilder()  //設定文檔上下文資訊
				.title(title)   //  文檔标題
				.description(description)		//  簡介
				.version("1.0")				//  版本
				// 設定聯系人  : 作者   網站位址  郵箱
				.contact(new Contact("lsx", "https://gitee.com/buluozhimu", "[email protected]"))  
				// 服務條款連結
				.termsOfServiceUrl("https://gitee.com/buluozhimu")
				// 認證許可
				.license("my swagger -- test")
				// 認證許可連結
				.licenseUrl("https://www.baidu.com")
				.build();  //  建構上下文對象a
	}
}
           

界面

springboot整合knife4jspringboot整合knife4j

@Bean(“swagger2ConfigDefault”)和@Bean(“swagger2ConfigCommon”) 分為兩個組,通過.groupName()方法進行分組

ApiInfo:建構首頁資訊

yml配置

knife4j:
  enable: true  #開啟增強配置
  production: false #開啟生産環境屏蔽
  basic:  #基本的登入認證
    enable: false
    password: lsx
    username: lsx
    #自定義footer
  setting:
    enableFooter: false
    enableFooterCustom: true
    footerCustomContent: Apache License 2.0 | Copyright  2021-[英雄聯盟](https://gitee.com/buluozhimu)
           

常用注解

  • @Api(tags = {“測試Controller”}) 給controller 起别名 類注解
  • @ApiOperation(“測試demo”) 方法的描述
  • @ApiParam(name = “a”,value = “使用者名”,required = true) 對參數的描述
  • @ApiIgnore 忽略 标注方法 或者 參數 則不生成對應文檔
  • @ApiImplicitParams
@ApiImplicitParams({   	//描述方法上的參數  功能和ApiParam 差不多  差别在于作用于方法上
	         	 @ApiImplicitParam(name = "id", value = "主鍵ID", required = true, paramType = "query"),           
			})
           
  • @ApiModel(value = “User”,description = “使用者實體”) 标注于實體類
  • @ApiModelProperty(value = “主鍵”,name = “id”) 标注與實體類的屬性
  • @ApiOperationSupport(author = “lsx”,order = 1) 标注方法上 添加作者 接口排序(Knife4j增強注解:需要在application.yml中開啟增強功能)

    示例代碼

@RestController
@RequestMapping(value = "/swagger",method = RequestMethod.POST)
@Api(tags = "swaggerController")
public class SwaggerController {
	
	@RequestMapping("/demo1")
	@ApiOperation("寫注釋我是認真的")
	@ApiOperationSupport(author = "lsx",order = 1)
	@ApiImplicitParams({   
        @ApiImplicitParam(name = "username", value = "使用者名", required = true,paramType = "query"),
        @ApiImplicitParam(name = "password", value = "密碼", required = true, paramType = "query"),
        @ApiImplicitParam(name = "createTime", value = "建立時間", required = true, paramType = "query"),
	})
	public SwaggerTestEntity demo1(@ApiIgnore SwaggerTestEntity user,@ApiParam(name = "videoFile",value = "檔案上傳") MultipartFile videoFile) {
		SwaggerTestEntity userEntity = new SwaggerTestEntity()
		.setCrateTime(new Date())
		.setId("uuid")
		.setUsername(user.getUsername())
		.setPassword(user.getPassword());
		return userEntity;
	}
	
}
           
@Data
@Accessors(chain = true)
@ApiModel(value = "SwaggerTestEntity",description = "swagger測試實體")
public class SwaggerTestEntity implements Serializable{
	private static final long serialVersionUID = 1L;

	@ApiModelProperty(value = "主鍵",name = "id")
	private String id;

	@ApiModelProperty(value = "使用者名",name = "username")
	private String username;

	@ApiModelProperty(value = "密碼",name = "password")
	private String password;


	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
	@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
	@ApiModelProperty(value = "建立日期",name = "crateTime")
	private Date crateTime;

}
           

接口界面

springboot整合knife4jspringboot整合knife4j