У нас есть требование генерировать несколько определений API с использованием аннотаций Java. Мы открыты для любых предложений, но один из предложенных вариантов представляется жизнеспособным, если мы сможем решить, как заставить его работать.
Нам в основном нужно сгенерировать 2 документа API из одной базы кода. Первый должен включать ВСЕ отсканированные ресурсы. Это не проблема, и мы можем добиться этого хорошо.
Вот сокращенная версия примера аннотированного метода:
@POST
@Path("/some/path")
@Consumes("application/json")
@Operation(
summary = "Do something...",
description = "Do something..."
)
@Tags({@Tag(name = "example-tag")})
@RequestBody(
description = "Do something...",
required = true,
content = @Content(
schema = @Schema(
implementation = Example.class
)
)
)
@ApiResponses({
@ApiResponse(
responseCode = "201",
description = "Do something...",
content = @Content(
schema = @Schema(
implementation = Example.class
)
)
)
})
public ApiResponse doSomething() throws Exception {
...
}
А вот как мы строим документы:
OpenAPI oas = new OpenAPI();
// The basic docs
Info info = new Info()
.title("...")
.description("...")
.termsOfService("...")
.contact(new Contact().email("..."))
.version("...");
// The API server
Server server = new Server().url("...");
// The authentication schemas
SecurityScheme scheme = new SecurityScheme()
.name("...")
.type(...)
.scheme("...")
.in(...);
Components components = new Components().addSecuritySchemes("example-auth", scheme)
oas.info(info);
oas.addServersItem(server);
oas.components(components);
ModelConverters instance = ModelConverters.getInstance();
instance.addConverter(new MultimapConverter());
SwaggerConfiguration oasConfig = new SwaggerConfiguration()
.openAPI(oas)
.prettyPrint(true)
.resourcePackages(Stream.of("...").collect(Collectors.toSet()));
OpenAPI openApi = new JaxrsOpenApiContextBuilder()
.openApiConfiguration(oasConfig)
.buildContext(true)
.read();
Хорошо, пока все хорошо. Мы получаем определение, которое содержит все. Теперь нам нужно создать второе определение. На этот раз необходимо исключить все операции, которые содержат @Tag=(name = "private")
.
. Я создал фильтр, который расширил AbstractSpecFilter , названный TagFilter
. Я переопределил реализацию и затем добавил ее в класс фильтра SwaggerConfiguration
:
SwaggerConfiguration oasConfig = new SwaggerConfiguration()
.openAPI(oas)
.filterClass(TagFilter.class.getName()) // Also tried getCanonicalName()
.prettyPrint(true)
.resourcePackages(Stream.of("...").collect(Collectors.toSet()));
К сожалению, класс фильтра никогда не создается. Не уверен, как еще перехватить операции по их удалению. Другие варианты, которые приходили нам в голову, - это использовать аннотацию @Hidden
, если бы мы могли найти способ заставить одно из определений игнорировать @Hidden
.