在 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 執行階段推斷的 basePath
  • host - 覆寫 Swagger 執行階段推斷的 host
  • tags - 規格中使用的標籤清單,包含其他中繼資料。
  • externalDocs - 其他外部文件參考

註解可以存在於 Swagger 執行階段掃描的任何類別上。例如,您的專案中可以有一個只有此註解的空介面 - 以便將一般 API 中繼資料與 API 資源特定的中繼資料分開。例如,將此註解放在標準 JAX-RS 資源旁邊

@SwaggerDefinition(

info = @Info(

description = "我的 API",

version = "V1.2.3",

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

termsOfService = "分享與關懷",

contact = @Contact(name = "海綿寶寶", email = "[email protected]", url = "https://swagger.dev.org.tw"),

license = @License(name = "Apache 2.0", url = "http://www.apache.org"),

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.dev.org.tw",

"email": "[email protected]"

},

"license": {

"name": "Apache 2.0",

"url": "http://www.apache.org"

},

"schemes": [

"http",

"https"

],

"consumes": [

"application/json"

],

"produces": [

"application/json"

],

"paths": {

...

您可以在 wiki 和其對應的 javadoc 中閱讀更多關於 SwaggerDefinition 註解的資訊。

@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 {

...

}

由於 ReaderLicenser 是 Swagger Core 專案中 JAX-RS 實作模組特有的,因此它位於 io.swagger.swagger-jaxrs 模組中,而不是像上述其他模組一樣位於 io.swagger.swagger-annotations 中。

對註解的更多改進

以上並非對 Swagger 註解所做的唯一改進和新增功能 - 我們還

  • 新增了 @ResponseHeader 註解,用於新增自訂回應標頭
  • 改進了 @ApiParam 中對範圍值的支援
  • 新增了每個 @ApiOperation 設定多個標籤的功能
  • 改進了對基於容器的回應/參數的支援。

一如既往 - 如果您遺漏了任何內容或發現問題 - 請透過 Google 群組GitHub 與我們聯繫,以便我們可以解決問題並使 Swagger 變得更好!