Skip to content

How can I properly display "overloaded" URL when using content negotiation #878

Closed
@maecval

Description

@maecval

Hi all,

We are using content negotiation (based on accept-header) for versioning the REST resources in our SpringBoot applications.
How can this be properly displayed in Swagger-UI?

We'd like to have

  • either 2 separate operations be listed in the Swagger-UI (one per version)
  • or 2 groups containing one version each (grouping done by either an own annotation or by evaluating the io.swagger.v3.oas.annotations)

(?) Can we e.g. use GroupedOpenApi (for example in combination with OperationCustomizer) to define 2 groups (let's say "Current" and "Deprecated") to seperate the versions?

I could not figure out how to create these groups.

The annotation io.swagger.v3.oas.annotations.Operation supports the "hidden" attribute. But this is not reflected in io.swagger.v3.oas.models.Operation. Hence the "operation" can not be modified to be hidden if it does not match the corresponding group.

(?) Can the Operation be "filtered out" in a, OperationCustomizer ?

Or how could we solve this issue?

NOTE:
This came up when migrating to Spring Boot 2.3 and updating to springdoc-openapi-ui.
Previsouly we used an approach with api selectors in the Docket in one of our apps:

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    ...
    ...
    @Bean
    public Docket swaggerSpringMvcPluginDeprecated(
        @Value("${info.app.name}") String name,
        @Value("${info.app.description}") String description,
        @Value("${info.app.version}") String version,
        @Value("${info.app.team}") String team,
        @Value("${info.app.url}") String url,
        @Value("${info.app.contact}") String contact
    ) {
        return new Docket(DocumentationType.SWAGGER_2)
            .useDefaultResponseMessages(false)
            .select()
            .apis(selector -> Objects.requireNonNull(selector).isAnnotatedWith(DeprecatedAPI.class))
            .build()
            .apiInfo(new ApiInfo(name, description, version, null, new Contact(team, url, contact), null, null, Collections.emptyList()))
            .groupName("Deprecated");
    }

I highly appreciate any help :-).
Kind regards,
Valentin

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions