1

我有一个 Spring Boot 应用程序,我正在尝试为其生成开放 API 3.0 文档,为此我正在使用 springdoc lib。我正在使用注释来记录应用程序的不同部分,最后我想自动生成文档。我正在为所有文档使用注释,并且发现从 springdocs 的官方文档中复制 yaml/json 中列出的类似内容有点困难。我有多个应用程序实例,并将所有这些实例的文档上传到一个开放的 API UI。对于多个主机,我已将它们定义如下:

@OpenAPIDefinition(
    info = @Info(
        title = "Title",
        version = "v1",
        description = "Desc",

    ),
    servers = {
        @Server(
            url = "https://server-1.com",
            description = "Server 1"
        ),
        @Server(
            url = "https://server-2.com",
            description = "Server 2"
        ),
        @Server(
            url = "https://server-3.com",
            description = "Server 3"
        )
    }
)
@SecurityScheme(name = "security_auth", type = SecuritySchemeType.OAUTH2,
    flows = @OAuthFlows(authorizationCode =
    @OAuthFlow(tokenUrl = "v1/authenticate")))
public class OpenAPIConfig {}

现在对我来说的问题是,toeken URL 像上面定义的那样显示,我想定义绝对 URL,它将根据用户选择进行更新。例如 - https://server-3.com/v1/authenticate。我怎样才能在注释中做到这一点?

4

1 回答 1

1

您应该为您的示例声明 3 个不同的 SecurityScheme。请注意,所有服务器 url/路径也可以从配置文件中获取。

这里有一个示例代码,您可以如何实现您的目标:

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.OAuthFlow;
import io.swagger.v3.oas.models.security.OAuthFlows;
import io.swagger.v3.oas.models.security.SecurityScheme.Type;
import io.swagger.v3.oas.models.servers.Server;

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

@Configuration
public class OpenAPIConfig {

    @Bean
    public OpenAPI openAPIDef() {
        String serverUrl1 = "https://server-1.com";
        String serverUrl2 = "https://server-2.com";
        String serverUrl3 = "https://server-3.com";
        String suffix = "/v1/authenticate";

        return new OpenAPI().info(new Info().title("Title").version("v1"))
                .addServersItem(new Server().url(serverUrl1))
                .addServersItem(new Server().url(serverUrl2))
                .addServersItem(new Server().url(serverUrl3))
                .components(new Components()
                        .addSecuritySchemes("security_auth_server1",
                                new io.swagger.v3.oas.models.security.SecurityScheme()
                                        .type(Type.OAUTH2)
                                        .flows(new OAuthFlows().authorizationCode(new OAuthFlow().tokenUrl(serverUrl1 + suffix))))
                        .addSecuritySchemes("security_auth_server2",
                                new io.swagger.v3.oas.models.security.SecurityScheme()
                                        .type(Type.OAUTH2)
                                        .flows(new OAuthFlows().authorizationCode(new OAuthFlow().tokenUrl(serverUrl2 + suffix))))
                        .addSecuritySchemes("security_auth_server3",
                                new io.swagger.v3.oas.models.security.SecurityScheme()
                                        .type(Type.OAUTH2)
                                        .flows(new OAuthFlows().authorizationCode(new OAuthFlow().tokenUrl(serverUrl3 + suffix)))));
    }
}
于 2020-09-20T14:34:13.267 回答