前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >久违了,升级一波 swagger starter!

久违了,升级一波 swagger starter!

作者头像
程序猿DD
发布2021-09-03 15:54:05
9090
发布2021-09-03 15:54:05
举报
文章被收录于专栏:程序猿DD程序猿DD

这个swagger的starter已经存在四年了,记得当时做这个的时候主要是由于swagger官方并没有提供类似spring boot官方其他starter模块一样的封装。当我们要用swagger的时候,还是要写很多Java配置来启动,所以就做了这个,尽可能的把原来要写在Java中的配置都转移到配置文件中来。

一个小小的封装,也获得了2k+的Star,使用也超过了3.1k。

之前由于springfox 3.0推出了starter(之前我也写了篇博客介绍使用SpringFox 3生成Swagger文档(https://blog.didispace.com/spring-boot-learning-21-2-7/)),想着既然有了这个,那就没有花太多精力去继续更新了。

但是,一直有收到用过springfox starter的小伙伴反应还是希望可以用纯配置的方式来使用swagger,希望这个swagger可以继续升级到最新的版本。所以,下面会继续跟进这个starter,这里要特别感谢andi.lin(https://github.com/llin6025)的积极参与,得以让这次的升级继续进行。

仓库地址:https://github.com/SpringForAll/spring-boot-starter-swagger

更新内容

  • 升级依赖的springfox swagger到3.0.0
  • 文档的开启关闭控制改为springfox.documentation.enabled参数

如何使用

在该项目的帮助下,我们的Spring Boot可以轻松的引入swagger。只需要做下面两个步骤:

  • pom.xml中引入依赖:
代码语言:javascript
复制
<dependency>
 <groupId>com.spring4all</groupId>
 <artifactId>swagger-spring-boot-starter</artifactId>
 <version>2.0.0.RELEASE</version>
</dependency>

注意

  1. 1.6.0开始,我们按Spring Boot官方建议修改了artifactId为swagger-spring-boot-starter,1.6.0之前的版本不做修改,依然为使用spring-boot-starter-swagger !
  2. 2.0.0开始,不再需要手工添加@EnableSwagger2Doc来启动Swagger配置

默认情况下就能产生所有当前Spring MVC加载的请求映射文档。

参数配置

更细致的配置内容参考如下:

配置示例
代码语言:javascript
复制
springfox.documentation.enabled=true

swagger.title=spring-boot-starter-swagger
swagger.description=Starter for swagger 2.x
swagger.version=1.4.0.RELEASE
swagger.license=Apache License, Version 2.0
swagger.licenseUrl=https://www.apache.org/licenses/LICENSE-2.0.html
swagger.termsOfServiceUrl=https://github.com/dyc87112/spring-boot-starter-swagger
swagger.contact.name=didi
swagger.contact.url=http://blog.didispace.com
swagger.contact.email=dyc87112@qq.com
swagger.base-package=com.didispace
swagger.base-path=/**
swagger.exclude-path=/error, /ops/**

swagger.globalOperationParameters[0].name=name one
swagger.globalOperationParameters[0].description=some description one
swagger.globalOperationParameters[0].modelRef=string
swagger.globalOperationParameters[0].parameterType=header
swagger.globalOperationParameters[0].required=true
swagger.globalOperationParameters[1].name=name two
swagger.globalOperationParameters[1].description=some description two
swagger.globalOperationParameters[1].modelRef=string
swagger.globalOperationParameters[1].parameterType=body
swagger.globalOperationParameters[1].required=false

// 取消使用默认预定义的响应消息,并使用自定义响应消息
swagger.apply-default-response-messages=false
swagger.global-response-message.get[0].code=401
swagger.global-response-message.get[0].message=401get
swagger.global-response-message.get[1].code=500
swagger.global-response-message.get[1].message=500get
swagger.global-response-message.get[1].modelRef=ERROR
swagger.global-response-message.post[0].code=500
swagger.global-response-message.post[0].message=500post
swagger.global-response-message.post[0].modelRef=ERROR
配置说明
默认配置
代码语言:javascript
复制
springfox.documentation.enabled=是否启用swagger,默认:true

swagger.title=标题
swagger.description=描述
swagger.version=版本
swagger.license=许可证
swagger.licenseUrl=许可证URL
swagger.termsOfServiceUrl=服务条款URL

swagger.contact.name=维护人
swagger.contact.url=维护人URL
swagger.contact.email=维护人email

swagger.base-package=swagger扫描的基础包,默认:全扫描
swagger.base-path=需要处理的基础URL规则,默认:/**
swagger.exclude-path=需要排除的URL规则,默认:空

swagger.host=文档的host信息,默认:空

swagger.globalOperationParameters[0].name=参数名
swagger.globalOperationParameters[0].description=描述信息
swagger.globalOperationParameters[0].modelRef=指定参数类型
swagger.globalOperationParameters[0].parameterType=指定参数存放位置,可选header,query,path,body.form
swagger.globalOperationParameters[0].required=指定参数是否必传,true,false

1.3.0.RELEASE新增:swagger.host属性,同时也支持指定docket的配置 1.4.0.RELEASE新增:

  • swagger.enabled:用于开关swagger的配置
  • swagger.globalOperationParameters:用于设置全局的参数,比如:header部分的accessToken等。该参数支持指定docket的配置。

2.0.0.RELEASE调整:

  • 原来的swagger.enabled配置修改为springfox.documentation.enabled来控制
Path规则说明

swagger.base-pathswagger.exclude-path使用ANT规则配置。

我们可以使用swagger.base-path来指定所有需要生成文档的请求路径基础规则,然后再利用swagger.exclude-path来剔除部分我们不需要的。

比如,通常我们可以这样设置:

代码语言:javascript
复制
management.context-path=/ops

swagger.base-path=/**
swagger.exclude-path=/ops/**, /error

上面的设置将解析所有除了/ops/开始以及spring boot自带/error请求路径。

其中,exclude-path可以配合management.context-path=/ops设置的spring boot actuator的context-path来排除所有监控端点。

分组配置

当我们一个项目的API非常多的时候,我们希望对API文档实现分组。从1.2.0.RELEASE开始,将支持分组配置功能。

具体配置内容如下:

代码语言:javascript
复制
swagger.docket.<name>.title=标题
swagger.docket.<name>.description=描述
swagger.docket.<name>.version=版本
swagger.docket.<name>.license=许可证
swagger.docket.<name>.licenseUrl=许可证URL
swagger.docket.<name>.termsOfServiceUrl=服务条款URL
swagger.docket.<name>.contact.name=维护人
swagger.docket.<name>.contact.url=维护人URL
swagger.docket.<name>.contact.email=维护人email
swagger.docket.<name>.base-package=swagger扫描的基础包,默认:全扫描
swagger.docket.<name>.base-path=需要处理的基础URL规则,默认:/**
swagger.docket.<name>.exclude-path=需要排除的URL规则,默认:空
swagger.docket.<name>.name=参数名
swagger.docket.<name>.modelRef=指定参数类型
swagger.docket.<name>.parameterType=指定参数存放位置,可选header,query,path,body.form
swagger.docket.<name>.required=true=指定参数是否必传,true,false
swagger.docket.<name>.globalOperationParameters[0].name=参数名
swagger.docket.<name>.globalOperationParameters[0].description=描述信息
swagger.docket.<name>.globalOperationParameters[0].modelRef=指定参数存放位置,可选header,query,path,body.form
swagger.docket.<name>.globalOperationParameters[0].parameterType=指定参数是否必传,true,false

说明:<name>为swagger文档的分组名称,同一个项目中可以配置多个分组,用来划分不同的API文档。

分组配置示例

代码语言:javascript
复制
swagger.docket.aaa.title=group-a
swagger.docket.aaa.description=Starter for swagger 2.x
swagger.docket.aaa.version=1.3.0.RELEASE
swagger.docket.aaa.termsOfServiceUrl=https://gitee.com/didispace/spring-boot-starter-swagger
swagger.docket.aaa.contact.name=zhaiyongchao
swagger.docket.aaa.contact.url=http://spring4all.com/
swagger.docket.aaa.contact.email=didi@potatomato.club
swagger.docket.aaa.excludePath=/ops/**
swagger.docket.aaa.globalOperationParameters[0].name=name three
swagger.docket.aaa.globalOperationParameters[0].description=some description three override
swagger.docket.aaa.globalOperationParameters[0].modelRef=string
swagger.docket.aaa.globalOperationParameters[0].parameterType=header

swagger.docket.bbb.title=group-bbb
swagger.docket.bbb.basePackage=com.yonghui

说明:默认配置与分组配置可以一起使用。在分组配置中没有配置的内容将使用默认配置替代,所以默认配置可以作为分组配置公共部分属性的配置。swagger.docket.aaa.globalOperationParameters[0].name会覆盖同名的全局配置。

JSR-303校验注解支持(1.5.0 + 支持)

支持对JSR-303校验注解的展示,如下图所示:

目前共支持以下几个注解:

  • @NotNull
  • @Max、@Min
  • @Size
  • @Pattern
自定义全局响应消息配置(1.6.0 + 支持)

支持 POST,GET,PUT,PATCH,DELETE,HEAD,OPTIONS,TRACE 全局响应消息配置,配置如下

代码语言:javascript
复制
// 取消使用默认预定义的响应消息,并使用自定义响应消息
swagger.apply-default-response-messages=false
swagger.global-response-message.get[0].code=401
swagger.global-response-message.get[0].message=401get
swagger.global-response-message.get[1].code=500
swagger.global-response-message.get[1].message=500get
swagger.global-response-message.get[1].modelRef=ERROR
swagger.global-response-message.post[0].code=500
swagger.global-response-message.post[0].message=500post
swagger.global-response-message.post[0].modelRef=ERROR
UI功能配置(1.6.0 + 支持)
  • 调试按钮的控制(try it out)
代码语言:javascript
复制
swagger.ui-config.submit-methods=get,delete

该参数值为提供调试按钮的HTTP请求类型,多个用,分割。

如果不想开启调试功能,只需要如下设置即可:

代码语言:javascript
复制
swagger.ui-config.submit-methods=
  • 其他配置
代码语言:javascript
复制
# json编辑器
swagger.ui-config.json-editor=false

# 显示请求头
swagger.ui-config.show-request-headers=true

# 页面调试请求的超时时间
swagger.ui-config.request-timeout=5000
ignoredParameterTypes配置(1.6.0 + 支持)
代码语言:javascript
复制
# 基础配置
swagger.ignored-parameter-types[0]=com.didispace.demo.User
swagger.ignored-parameter-types[1]=com.didispace.demo.Product

# 分组配置
swagger.docket.aaa.ignored-parameter-types[0]=com.didispace.demo.User
swagger.docket.aaa.ignored-parameter-types[1]=com.didispace.demo.Product

该参数作用:Q. Infinite loop when springfox tries to determine schema for objects with nested/complex constraints? A. If you have recursively defined objects, I would try and see if providing an alternate type might work or perhaps even ignoring the offending classes e.g. order using the docket. ignoredParameterTypes(Order.class). This is usually found in Hibernate domain objects that have bidirectional dependencies on other objects.

Authorization 鉴权配置 (1.7.0 + 支持)
  • 新增 Authorization 配置项
代码语言:javascript
复制
# 鉴权策略ID,对应 SecurityReferences ID
swagger.authorization.name=Authorization

# 鉴权策略,可选 ApiKey | BasicAuth | None,默认ApiKey
swagger.authorization.type=ApiKey

# 鉴权传递的Header参数
swagger.authorization.key-name=token

# 需要开启鉴权URL的正则, 默认^.*$匹配所有URL
swagger.authorization.auth-regex=^.*$

备注:目前支持ApiKey | BasicAuth鉴权模式,None除消鉴权模式,默认ApiKey,后续添加Oauth2支持

使用须知

  1. 默认已经在全局开启了global的SecurityReferences,无需配置任何参数就可以使用;
  2. 全局鉴权的范围在可以通过以上参数auth-regex进行正则表达式匹配控制;
  3. 除了全局开启外,还可以手动通过注解在RestController上进行定义鉴权,使用方式如下:
代码语言:javascript
复制
// 其中的ID Authorization 即为配置项 swagger.authorization.name,详细请关注后面的配置代码
@ApiOperation(value = "Hello World", authorizations = {@Authorization(value = "Authorization")})
@RequestMapping(value = "/hello", method = RequestMethod.GET)
String hello();

关于如何配置实现鉴权,请关注以下code:

代码语言:javascript
复制
/**
 * 配置基于 ApiKey 的鉴权对象
 *
 * @return
 */
private ApiKey apiKey() {
    return new ApiKey(swaggerProperties().getAuthorization().getName(),
            swaggerProperties().getAuthorization().getKeyName(),
            ApiKeyVehicle.HEADER.getValue());
}

/**
 * 配置默认的全局鉴权策略的开关,以及通过正则表达式进行匹配;默认 ^.*$ 匹配所有URL
 * 其中 securityReferences 为配置启用的鉴权策略
 *
 * @return
 */
private SecurityContext securityContext() {
    return SecurityContext.builder()
            .securityReferences(defaultAuth())
            .forPaths(PathSelectors.regex(swaggerProperties().getAuthorization().getAuthRegex()))
            .build();
}

/**
 * 配置默认的全局鉴权策略;其中返回的 SecurityReference 中,reference 即为ApiKey对象里面的name,保持一致才能开启全局鉴权
 *
 * @return
 */
private List<SecurityReference> defaultAuth() {
    AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
    AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
    authorizationScopes[0] = authorizationScope;
    return Collections.singletonList(SecurityReference.builder()
            .reference(swaggerProperties().getAuthorization().getName())
            .scopes(authorizationScopes).build());
}

最后,如果您正在学习Spring Boot,推荐一个连载多年还在继续更新的免费教程:《Spring Boot 2.x基础教程》:http://blog.didispace.com/spring-boot-learning-2x/ 。

如果学习过程中如遇困难?可以加入我们Spring技术交流群(关注文末公众号,回复“加群”),参与交流与讨论,更好的学习与进步!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿DD 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 更新内容
  • 如何使用
  • 参数配置
    • 配置示例
      • 配置说明
        • 默认配置
        • Path规则说明
        • 分组配置
        • JSR-303校验注解支持(1.5.0 + 支持)
        • 自定义全局响应消息配置(1.6.0 + 支持)
        • UI功能配置(1.6.0 + 支持)
        • ignoredParameterTypes配置(1.6.0 + 支持)
        • Authorization 鉴权配置 (1.7.0 + 支持)
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档