Фильтр регистрации OpenApi 3.0 для исключения методов с указанными c тегами - PullRequest
0 голосов
/ 07 апреля 2020

У нас есть требование генерировать несколько определений 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.

...