在 1.5.x 中自定义自动生成的 Swagger 定义

  2015年7月23日

作者:Ole Lensmar

最近用于 Java 的 Swagger 核心工具为 Swagger 运行时用于生成 API 的 Swagger 定义的核心注解添加了许多功能。让我们快速看看这些功能,了解它们在使用自下而上的方法创建 Swagger 定义时如何帮助您提供更完整的 API 元数据。

@SwaggerDefinition

@SwaggerDefinition 注解是核心注解中最大的一个新增功能;它为您提供了一种向生成的 Swagger 添加定义级别元数据的方式,所有这些都直接与 Swagger 2.0 规范中 Swagger 对象的属性相关联。

  • info - 提供关于整个 API 的元数据(标题、描述、许可证等)
  • consumes - 此定义中描述的 API 消耗的 MIME 类型全局列表
  • produces - 此定义中描述的 API 生成的 MIME 类型全局列表
  • schemes - 此 API 支持的传输协议
  • basePath - 覆盖 Swagger 运行时推断的基本路径
  • host - 覆盖 Swagger 运行时推断的主机
  • tags - 规范使用的标签列表,附带额外的元数据。
  • externalDocs - 额外的外部文档引用

该注解可以放置在 Swagger 运行时扫描的任何类上。例如,您的项目中可以有一个只带有此注解的空接口,以将通用 API 元数据与特定于 API 资源的元数据分开。例如,将此注解与标准的 JAX-RS 资源放在一起:

@SwaggerDefinition(

info = @Info(

description = "我的 API",

version = "V1.2.3",

title = "您需要了解的关于我的唯一 API",

termsOfService = "分享与关爱",

contact = @Contact(name = "海绵宝宝", email = "[受电子邮件保护]", url = "https://swagger.org.cn"),

license = @License(name = "Apache 2.0", url = "https://apache.ac.cn"),

consumes = {"application/json" },

produces = {"application/json" },

schemes = {SwaggerDefinition.Scheme.HTTP, SwaggerDefinition.Scheme.HTTPS},

externalDocs = @ExternalDocs(value = "关于我", url = "http://about.me/me")

)

public interface MyApiDefinition {}

这将导致以下内容被添加到生成的 Swagger 定义中:

{

"swagger": "2.0",

"info": {

"description": "我的 API",

"version": "V1.2.3",

"title": "您需要了解的关于我的唯一 API",

"termsOfService": "分享与关爱",

"contact": {

"name": "海绵宝宝",

"url": "https://swagger.org.cn",

"email": "[受电子邮件保护]"

},

"license": {

"name": "Apache 2.0",

"url": "https://apache.ac.cn"

},

"schemes": [

"http",

"https"

],

"consumes": [

"application/json"

],

"produces": [

"application/json"

],

"paths": {

...

您可以在 wiki 上阅读更多关于 SwaggerDefinition 注解的信息,以及其对应的 javadoc

@Extension

扩展注解允许您向 Swagger 定义添加 扩展属性。它目前支持 @ApiOperation@Info@Tag 注解。有两种使用方式:

...

extensions = {

@Extension(properties = {

@ExtensionProperty(name = "test1", value = "value1"),

@ExtensionProperty(name = "test2", value = "value2")

})

}

...

这将产生以下 JSON:

...

"x-test1" : "value1",

"x-test2" : "value2"

...

属性名如果未在注解中显式指定,将自动加上“x-”前缀。

或者,您可以命名扩展:

...

extensions = {

@Extension( name = "my-extension", properties = {

@ExtensionProperty(name = "test1", value = "value1"),

@ExtensionProperty(name = "test2", value = "value2")

})

}

...

这将产生以下 JSON:

...

"x-my-extension" : {

"test1" : "value1",

"test2" : "value2"

}

...

这将把包含的扩展属性封装在一个 JSON 对象中。

ReaderListener

如果这些注解扩展仍然不能帮助您以所需方式构建 Swagger 定义,您可以选择创建一个 ReaderListener,它将在 Swagger 运行时之前和之后被调用。此扩展读取所有 Swagger 和 JAX-RS 注解,并构建相应的 Swagger 定义。实现任一处理程序都可以完全控制生成的定义,从而允许您以任何方式更改它:

  • 添加安全定义或自定义模型对象
  • 根据某些上下文属性过滤掉不需要的信息
  • 读取并添加在其他地方定义的 API 定义
  • 等等...

您需要做的就是提供一个实现 ReaderListener 接口的类,并确保该类能被 Swagger 运行时使用的类路径扫描器找到。如果您创建了一个如上所示的 @SwaggerDefinition 注解接口,您可以将其更改为一个类,并在其中实现此接口:

@SwaggerDefinition(...)

public class MyApiDefinition implements ReaderListener {

public static final String TOKEN_AUTH_SCHEME = "tokenAuthScheme";

public static final String ACCOUNT_READ_SCOPE = "account_read";

public static final String ACCOUNT_WRITE_SCOPE = "account_write";

@Override

public void beforeScan(Reader reader, Swagger swagger) {

}

@Override

public void afterScan(Reader reader, Swagger swagger) {

OAuth2Definition tokenScheme = new OAuth2Definition();

tokenScheme.setFlow("password");

tokenScheme.setTokenUrl("https://" + swagger.getHost() + "/tokens");

Map<String, String> scopes = new HashMap<>();

scopes.put(ACCOUNT_READ_SCOPE, "读取我的数据");

scopes.put(ACCOUNT_WRITE_SCOPE, "更新我的数据");

tokenScheme.setScopes(scopes);

swagger.addSecurityDefinition(TOKEN_AUTH_SCHEME, tokenScheme);

}

}

此示例添加了一个 OAuth2 密码凭证授权安全定义,您可以在 @ApiOperation 注解中引用它,例如:

@ApiOperation(value = "Updates user data",

authorizations = @Authorization(value = MyApiDefinition.TOKEN_AUTH_SCHEME, scopes =

@AuthorizationScope(scope = MyApiDefinition.ACCOUNT_WRITE_SCOPE, description = "对用户数据的写入权限")))

public Response updateUser( UserData data ) throws NotFoundException {

...

}

由于 ReaderListener 特定于 Swagger Core 项目中的 JAX-RS 实现模块,因此它在 io.swagger.swagger-jaxrs 模块中可用,而不是像上面描述的其他模块一样在 io.swagger.swagger-annotations 中。

注解的更多改进

以上并非对 Swagger 注解的唯一改进和新增——我们还:

  • 添加了 @ResponseHeader 注解,用于添加自定义响应头
  • 改进了 @ApiParam 中范围值(Ranged values)的支持
  • 添加了为每个 @ApiOperation 设置多个标签的功能
  • 改进了基于容器的响应/参数的支持。

一如既往——如果您缺少某些功能或发现问题——请在 Google GroupGitHub 上与我们联系,以便我们解决问题,让 Swagger 变得更好!

© . All rights reserved.