在springdocs中,我可以基于操作上的标签定义多个OpenAPI定义

问题描述

我需要使用springdocs为单个应用程序中的同一API定义两个不同的OpenApi定义:一个内部开发人员,一个外部开发人员。外部定义将包括内部定义中的某些操作,但不是全部。

我研究过使用GroupedOpenApi创建两个定义,但这要求我将应从外部定义中排除的端点移至单独的RestController中,并移至排除的包,该包将不包含在定义中对于外部开发人员,但仍将包含在内部定义中。我宁愿根据API定义而不是根据对端点的安全性访问来构造代码

似乎可以使用GroupedOpenApi之类的东西,使用SecurityScheme或标签来定义给定定义中包括哪些操作,以及要包含的路径/包。因此,例如,我可以使用以下内容为我的外部API定义定义:

GroupedOpenApi.builder()
            .group("externalGroupName")
            .securitySchemesToInclude("externalSchemeName") // this doesn't currently exist
            .build();

然后,使用该SecurityScheme标记有SecurityRequirement的所有操作都将添加到此外部定义中。因此,例如,我可以在同一个RestController中定义以下两个端点:

包括在内

    @SecurityRequirement(name = "externalSchemeName")
    @GET
    @Path("/pets")
    public Response getResponse(){
        return null;
    }
}

将不包括在内

    @SecurityRequirement(name = "internalSchemeName")
    @GET
    @Path("/pets/internal")
    public Response getInternalResponse(){
        return null;
    }
}

使用这种方法,最好提供类似于路径/程序包包含/排除的包含/排除安全方案。

这似乎需要对springdocs做出贡献,除非我误解了如何创建多个定义的选项。是否有另一种方法可以将操作仅从我定义的一个定义中排除,而不会将该操作完全隐藏在所有定义中,也无需重组我的程序包?

请注意,如果可能的话,我也不希望保留不在配置组中的所有路径的列表,因为这容易出错,并且不允许跨多个服务提供共享配置。我宁愿使用一种注释驱动的方法,该方法类似于完成其他swagger自定义方法,以便我一次定义配置,然后在基于注释定义或修改每个资源时更新每个资源,以驱动所生成的swagger。

解决方法

使用您的示例,您还没有使用GroupedOpenApi的其他过滤器(基于路径):

    GroupedOpenApi.builder()
            .group("internalGroupName")
            .pathsToMatch("/pets/internal")
            .build();

    GroupedOpenApi.builder()
            .group("externalGroupName")
            .pathsToMatch("/pets")
            .packagesToExclude("/pets/internal")
            .build();