1. Introduction

springdoc-openapi java library helps automating the generation of API documentation using spring boot projects. springdoc-openapi works by examining an application at runtime to infer API semantics based on spring configurations, class structure and various annotations.

Automatically generates documentation in JSON/YAML and HTML format APIs. This documentation can be completed by comments using swagger-api annotations.

This library supports:

  • OpenAPI 3

  • Spring-boot (v1 and v2)

  • JSR-303, specifically for @NotNull, @Min, @Max, and @Size.

  • Swagger-ui

  • OAuth 2

The following video introduces the Library:

spring.io conference

This is a community-based project, not maintained by the Spring Framework Contributors (Pivotal).

2. Getting Started

For the integration between spring-boot and swagger-ui, add the library to the list of your project dependencies (No additional configuration is needed)

   <dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-ui</artifactId>
      <version>1.5.0</version>
   </dependency>

This will automatically deploy swagger-ui to a spring-boot application:

  • Documentation will be available in HTML format, using the official swagger-ui jars

  • The Swagger UI page will then be available at http://server:port/context-path/swagger-ui.html and the OpenAPI description will be available at the following url for json format: http://server:port/context-path/v3/api-docs

    • server: The server name or IP

    • port: The server port

    • context-path: The context path of the application

  • Documentation can be available in yaml format as well, on the following path : /v3/api-docs.yml

For custom path of the swagger documentation in HTML format, add a custom springdoc property, in your spring-boot configuration file: .
# swagger-ui custom path
springdoc.swagger-ui.path=/swagger-ui.html

3. Springdoc-openapi Modules

3.1. General overview

Architecture

3.2. Spring-webmvc support

  • Documentation will be available at the following url for json format: http://server:port/context-path/v3/api-docs

    • server: The server name or IP

    • port: The server port

    • context-path: The context path of the application

  • Documentation will be available in yaml format as well, on the following path : /v3/api-docs.yml

  • Add the library to the list of your project dependencies. (No additional configuration is needed)

   <dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-webmvc-core</artifactId>
      <version>1.5.0</version>
   </dependency>
This dependency is relevant if you want to generate the OpenAPI description without using the swagger-ui.
For custom path of the OpenAPI documentation in Json format, add a custom springdoc property, in your spring-boot configuration file:
# /api-docs endpoint custom path
springdoc.api-docs.path=/api-docs

3.3. Spring-webflux support

  • Documentation can be available in yaml format as well, on the following path : /v3/api-docs.yml

  • Add the library to the list of your project dependencies (No additional configuration is needed)

   <dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-webflux-ui</artifactId>
      <version>1.5.0</version>
   </dependency>

3.4. Spring Hateoas support

The support for Spring Hateoas is available using the dependency springdoc-openapi-hateoas. The projects that use Spring Hateoas should combine this dependency with the springdoc-openapi-ui dependency. This dependency enables the support of Spring Hateoas format.

   <dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-hateoas</artifactId>
      <version>1.5.0</version>
   </dependency>

3.5. Spring Data Rest support

The support for Pageable of spring-data-commons is available. If only want to enable the support of spring Pageable Type, you can just enable it using:

SpringDocUtils.getConfig().replaceWithClass(org.springframework.data.domain.Pageable.class,
org.springdoc.core.converters.models.Pageable.class);

Alternately, the projects that use Pageable type can aslo add the follwing dependency together with the springdoc-openapi-ui dependency. This dependency enables the support of spring-data-rest types as well: @RepositoryRestResource and QuerydslPredicate annotations.

   <dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-data-rest</artifactId>
      <version>1.5.0</version>
   </dependency>

3.6. Spring security support

For a project that uses spring-security, you should add the following dependency, together with the springdoc-openapi-ui dependency: This dependency helps ignoring @AuthenticationPrincipal in case its used on REST Controllers.

   <dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-security</artifactId>
      <version>1.5.0</version>
   </dependency>

3.7. Kotlin support

For a project that uses Kotlin, you should add the following dependency. This dependency improves the support of Kotlin types:

   <dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-kotlin</artifactId>
      <version>1.5.0</version>
   </dependency>
  • If your are using spring-web, you combine the springdoc-openapi-kotlin module with springdoc-openapi-ui.

  • If your are using spring-webflux, you combine the springdoc-openapi-kotlin module with springdoc-openapi-webflux-ui.

3.8. Groovy support

For a project that uses Groovy, you should add the following dependency, together with the springdoc-openapi-ui dependency: This dependency improves the support of Kotlin types:

   <dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-groovy</artifactId>
      <version>1.5.0</version>
   </dependency>

4. Springdoc-openapi Features

4.1. Adding API Information and Security documentation

The library uses spring-boot application auto-configured packages to scan for the following annotations in spring beans: OpenAPIDefinition and Info. These annotations declare, API Information: Title, version, licence, security, servers, tags, security and externalDocs. For better performance of documentation generation, declare @OpenAPIDefinition and @SecurityScheme annotations within a spring managed bean.

4.2. Error Handling for REST using @ControllerAdvice

To generate documentation automatically, make sure all the methods declare the HTTP Code responses using the annotation: @ResponseStatus

4.3. Disabling the springdoc-openapi endpoints

In order to disable the springdoc-openapi endpoint (/v3/api-docs by default) use the following property:

# Disabling the /v3/api-docs enpoint
springdoc.api-docs.enabled=false

4.4. Disabling the swagger-ui

In order to disable the swagger-ui, use the following property:

# Disabling the swagger-ui
springdoc.swagger-ui.enabled=false

4.5. Swagger-ui configuration

The library supports the swagger-ui official properties:

You need to declare swagger-ui properties as spring-boot properties. All these properties should be declared with the following prefix: springdoc.swagger-ui

4.6. Selecting the Rest Controllers to include in the documentation

Additionally to @Hidden annotation from swagger-annotations, its possible to restrict the generated OpenAPI description using package or path configuration.

For the list of packages to include, use the following property:

# Packages to include
springdoc.packagesToScan=com.package1, com.package2

For the list of paths to include, use the following property:

# Paths to include
springdoc.pathsToMatch=/v1, /api/balance/**

4.7. Spring-webflux/WebMvc.fn with Functional Endpoints

Since version v1.5.0, a functional DSL has been introduced, thanks to this enhancement in the spring-frameowrk: #25938

It’s an alternative functional API to the @RouterOperations annotations.

This is a sample DSL, to generate OpenAPI description to the webflux/WebMvc.fn REST endpoints:

@Bean
RouterFunction<?> routes() {
    return route().GET("/foo", HANDLER_FUNCTION, ops -> ops
            .operationId("hello")
            .parameter(parameterBuilder().name("key1").description("My key1 description"))
            .parameter(parameterBuilder().name("key2").description("My key2 description"))
            .response(responseBuilder().responseCode("200").description("This is normal response description"))
            .response(responseBuilder().responseCode("404").description("This is another response description"))
    ).build();
}

Here is the link for some sample codes:

And the Demo code, using the functionnal endpoints DSL:

Since version v1.3.8, the support of functional endpoints has been added. Two main annotations have been added for this purpose: @RouterOperations and @RouterOperation.

Only REST APIs with the @RouterOperations and @RouterOperation can be displayed on the swagger-ui.

  • @RouterOperation: It can be used alone, if the Router bean contains one single route related to the REST API.. When using @RouterOperation, its not mandatory to fill the path

  • @RouterOperation, can reference directly a spring Bean (beanClass property) and the underlying method (beanMethod property): Springdoc-openapi, will then inspect this method and the swagger annotations on this method level.

@Bean
@RouterOperation(beanClass = EmployeeService.class, beanMethod = "findAllEmployees")
RouterFunction<ServerResponse> getAllEmployeesRoute() {
   return route(GET("/employees").and(accept(MediaType.APPLICATION_JSON)),
         req -> ok().body(
               employeeService().findAllEmployees(), Employee.class));
}
  • @RouterOperation, contains the @Operation annotation. The @Operation annotation can also be placed on the bean method level if the property beanMethod is declared.

Don’t forget to set operationId which is mandatory.
@Bean
@RouterOperation(operation = @Operation(operationId = "findEmployeeById", summary = "Find purchase order by ID", tags = { "MyEmployee" },
      parameters = { @Parameter(in = ParameterIn.PATH, name = "id", description = "Employee Id") },
      responses = { @ApiResponse(responseCode = "200", description = "successful operation", content = @Content(schema = @Schema(implementation = Employee.class))),
            @ApiResponse(responseCode = "400", description = "Invalid Employee ID supplied"),
            @ApiResponse(responseCode = "404", description = "Employee not found") }))
RouterFunction<ServerResponse> getEmployeeByIdRoute() {
   return route(GET("/employees/{id}"),
         req -> ok().body(
               employeeRepository().findEmployeeById(req.pathVariable("id")), Employee.class));
}
  • @RouterOperations: This annotation should be used if the Router bean contains multiple routes. When using RouterOperations, its mandatory to fill the path property.

  • A @RouterOperations, contains many @RouterOperation.

@RouterOperations({ @RouterOperation(path = "/getAllPersons", beanClass = PersonService.class, beanMethod = "getAll"),
      @RouterOperation(path = "/getPerson/{id}", beanClass = PersonService.class, beanMethod = "getById"),
      @RouterOperation(path = "/createPerson", beanClass = PersonService.class, beanMethod = "save"),
      @RouterOperation(path = "/deletePerson/{id}", beanClass = PersonService.class, beanMethod = "delete") })
@Bean
public RouterFunction<ServerResponse> personRoute(PersonHandler handler) {
   return RouterFunctions
         .route(GET("/getAllPersons").and(accept(MediaType.APPLICATION_JSON)), handler::findAll)
         .andRoute(GET("/getPerson/{id}").and(accept(MediaType.APPLICATION_STREAM_JSON)), handler::findById)
         .andRoute(POST("/createPerson").and(accept(MediaType.APPLICATION_JSON)), handler::save)
         .andRoute(DELETE("/deletePerson/{id}").and(accept(MediaType.APPLICATION_JSON)), handler::delete);
}

All the documentations filled using @RouterOperation, might be completed by the router function data. For that, @RouterOperation fields must help identify uniquely the concerned route. springdoc-openpi scans for a unique route related to a @RouterOperation annotation, using on the following criteria:

  • by path

  • by path and RequestMethod

  • by path and produces

  • by path and consumes

  • by path and RequestMethod and produces

  • by path and RequestMethod and consumes

  • by path and produces and consumes

  • by path and RequestMethod and produces and consumes

Some code samples are available on GITHUB of demos:

And some of the project tests: (from app69 to app75)

4.8. Integration with WildFly

  • For WildFly users, you need to add the following dependency to make the swagger-ui work:

   <dependency>
     <groupId>org.webjars</groupId>
     <artifactId>webjars-locator-jboss-vfs</artifactId>
     <version>0.1.0</version>
   </dependency>

5. Springdoc-openapi Properties

springdoc-openapi relies on standard spring configuration properties (yml or properties) using the standard files locations.

5.1. springdoc-openapi core properties

Parameter name Default Value Description

springdoc.api-docs.path

/v3/api-docs

String, For custom path of the OpenAPI documentation in Json format.

springdoc.api-docs.enabled

true

Boolean. To disable the springdoc-openapi endpoint (/v3/api-docs by default).

springdoc.packages-to-scan

*

List of Strings.The list of packages to scan (comma separated)

springdoc.paths-to-match

/*

List of Strings.The list of paths to match (comma separated)

springdoc.produces-to-match

/*

List of Strings.The list of produces mediaTypes to match (comma separated)

springdoc.headers-to-match

/*

List of Strings.The list of headers to match (comma separated)

springdoc.consumes-to-match

/*

List of Strings.The list of consumes mediaTypes to match (comma separated)

springdoc.paths-to-exclude

List of Strings.The list of paths to exclude (comma separated)

springdoc.packages-to-exclude

List of Strings.The list of packages to exclude (comma separated)

springdoc.default-consumes-media-type

application/json

String. The default consumes media type.

springdoc.default-produces-media-type

/

String.The default produces media type.

springdoc.cache.disabled

false

Boolean. To disable the springdoc-openapi cache of the the calculated OpenAPI.

springdoc.show-actuator

false

Boolean. To display the actuator endpoints.

springdoc.auto-tag-classes

true

Boolean. To disable the springdoc-openapi automatic tags.

springdoc.model-and-view-allowed

false

Boolean. To allow RestControllers with ModelAndView return to appear in the OpenAPI description.

springdoc.override-with-generic-response

true

Boolean. When true, automatically adds @ControllerAdvice responses to all the generated responses.

springdoc.api-docs.groups.enabled

true

Boolean. To disable the springdoc-openapi groups.

springdoc.group-configs[0].group

String.The group name

springdoc.group-configs[0].packages-to-scan

*

List of Strings.The list of packages to scan for a group (comma separated)

springdoc.group-configs[0].paths-to-match

/*

List of Strings.The list of paths to match for a group(comma separated)

springdoc.group-configs[0].paths-to-exclude

``

List of Strings.The list of paths to exclude for a group(comma separated)

springdoc.group-configs[0].packages-to-exclude

List of Strings.The list of packages to exclude for a group(comma separated)

springdoc.group-configs[0].produces-to-match

/*

List of Strings.The list of produces mediaTypes to match (comma separated)

springdoc.group-configs[0].consumes-to-match

/*

List of Strings.The list of consumes mediaTypes to match (comma separated)

springdoc.group-configs[0].headers-to-match

/*

List of Strings.The list of headers to match (comma separated)

springdoc.webjars.prefix

/webjars

String, To change the webjars prefix that is visible the URL of swagger-ui for spring-webflux.

springdoc.api-docs.resolve-schema-properties

false

Boolean. To enable property resolver on @Schema (name, title and description).

springdoc.remove-broken-reference-definitions

true

Boolean. To disable removal of broken reference definitions.

springdoc.writer-with-default-pretty-printer

false

Boolean. To enable pretty print of the OpenApi specification.

springdoc.model-converters. deprecating-converter.enabled

true

Boolean. To disable deprecating model converter.

springdoc.use-fqn

false

Boolean. To enable fully qualified names.

springdoc.show-login-endpoint

false

Boolean. To make spring security login-endpoint visible.

springdoc.pre-loading-enabled

false

Boolean. Pre-loading setting to load OpenAPI on application startup.

springdoc.writer-with-order-by-keys

false

Boolean. Enable a deterministic/alphabetical orderding.

5.2. swagger-ui properties

  • The support of the swagger-ui properties is available on springdoc-openapi. See Official documentation.

  • You can use the same swagger-ui properties in the documentation as Spring Boot properties.

All these properties should be declared with the following prefix: springdoc.swagger-ui
Parameter name Default Value Description

springdoc.swagger-ui.path

/swagger-ui.html

String, For custom path of the swagger-ui HTML documentation.

springdoc.swagger-ui.enabled

true

Boolean. To disable the swagger-ui endpoint (/swagger-ui.html by default).

springdoc.swagger-ui.configUrl

/v3/api-docs/swagger-config

String. URL to fetch external configuration document from.

springdoc.swagger-ui.layout

BaseLayout

String. The name of a component available via the plugin system to use as the top-level layout for Swagger UI.

springdoc.swagger-ui.validatorUrl

null

By default, Swagger UI attempts to validate specs against swagger.io’s online validator. You can use this parameter to set a different validator URL, for example for locally deployed validators Validator Badge. Setting it to null will disable validation.

springdoc.swagger-ui.filter

false

Boolean OR String. If set, enables filtering. The top bar will show an edit box that you can use to filter the tagged operations that are shown. Can be Boolean to enable or disable, or a string, in which case filtering will be enabled using that string as the filter expression. Filtering is case sensitive matching the filter expression anywhere inside the tag.

springdoc.swagger-ui.operationsSorter

Function=(a ⇒ a). Apply a sort to the operation list of each API. It can be 'alpha' (sort by paths alphanumerically), 'method' (sort by HTTP method) or a function (see Array.prototype.sort() to know how sort function works). Default is the order returned by the server unchanged.

springdoc.swagger-ui.tagsSorter

Function=(a ⇒ a). Apply a sort to the tag list of each API. It can be 'alpha' (sort by paths alphanumerically) or a function see Array.prototype.sort() to learn how to write a sort function). Two tag name strings are passed to the sorter for each pass. Default is the order determined by Swagger UI.

springdoc.swagger-ui.oauth2RedirectUrl

/swagger-ui/oauth2-redirect.html

String. OAuth redirect URL.

springdoc.swagger-ui.displayOperationId

false

Boolean. Controls the display of operationId in operations list. The default is false.

springdoc.swagger-ui.displayRequestDuration

false

Boolean. Controls the display of the request duration (in milliseconds) for "Try it out" requests.

springdoc.swagger-ui.deepLinking

false

Boolean. If set to true, enables deep linking for tags and operations. See the [Deep Linking documentation](/docs/usage/deep-linking.md) for more information.

springdoc.swagger-ui.defaultModelsExpandDepth

1

Number. The default expansion depth for models (set to -1 completely hide the models).

springdoc.swagger-ui.defaultModelExpandDepth

1

Number. The default expansion depth for the model on the model-example section.

springdoc.swagger-ui.defaultModelRendering

String=["example"*, "model"]. Controls how the model is shown when the API is first rendered. (The user can always switch the rendering for a given model by clicking the 'Model' and 'Example Value' links.)

springdoc.swagger-ui.docExpansion

String=["list"*, "full", "none"]. Controls the default expansion setting for the operations and tags. It can be 'list' (expands only the tags), 'full' (expands the tags and operations) or 'none' (expands nothing).

springdoc.swagger-ui.maxDisplayedTags

Number. If set, limits the number of tagged operations displayed to at most this many. The default is to show all operations.

springdoc.swagger-ui.showExtensions

false

Boolean. Controls the display of vendor extension (x-) fields and values for Operations, Parameters, and Schema.

springdoc.swagger-ui.url

String.To configure, the path of a custom OpenAPI file . Will be ignored if urls is used.

springdoc.swagger-ui.showCommonExtensions

false

Boolean. Controls the display of extensions (pattern, maxLength, minLength, maximum, minimum) fields and values for Parameters.

springdoc.swagger-ui.supportedSubmitMethods

Array=["get", "put", "post", "delete", "options", "head", "patch", "trace"]. List of HTTP methods that have the "Try it out" feature enabled. An empty array disables "Try it out" for all operations. This does not filter the operations from the display.

springdoc.swagger-ui.display-query-params-without-oauth2

false

Boolean. To enable access to swagger-ui using url query params instead of configUrl. If the REST APIs, are not using OAuth2 (Available if groups are not enabled. Prevents the load of the swagger-config twice with configUrl, available since v1.4.1).

springdoc.swagger-ui.display-query-params

false

Boolean. To enable access to swagger-ui using url query params instead of configUrl. If the REST APIs, are using OAuth2 (Available if groups are not enabled. Prevents the load of the swagger-config twice with configUrl, available since v1.4.1).

springdoc.swagger-ui.oauth. additionalQueryStringParams

String. Additional query parameters added to authorizationUrl and tokenUrl.

springdoc.swagger-ui.disable-swagger-default-url

false

Boolean. To disable the swagger-ui default petstore url. (Available since v1.4.1).

springdoc.swagger-ui.urls[0].url

URL. The url of the swagger group, used by Topbar plugin. URLs must be unique among all items in this array, since they’re used as identifiers.

springdoc.swagger-ui.urls[0].name

String. The name of the swagger group, used by Topbar plugin. Names must be unique among all items in this array, since they’re used as identifiers.

springdoc.swagger-ui.urlsPrimaryName

String. The name of the swagger group which will be displayed when Swagger UI loads.

springdoc.swagger-ui.oauth.clientId

String. Default clientId. MUST be a string.

springdoc.swagger-ui.oauth.clientSecret

String. Default clientSecret. Never use this parameter in your production environment. It exposes crucial security information. This feature is intended for dev/test environments only.

springdoc.swagger-ui.oauth.realm

String. realm query parameter (for OAuth 1) added to authorizationUrl and tokenUrl.

springdoc.swagger-ui.oauth.appName

String. OAuth application name, displayed in authorization popup.

springdoc.swagger-ui.oauth.scopeSeparator

String. OAuth scope separator for passing scopes, encoded before calling, default value is a space (encoded value %20).

springdoc.swagger-ui.csrf.enabled

false

Boolean. To enable CSRF support

springdoc.swagger-ui.csrf.cookie-name

XSRF-TOKEN

String. Optional CSRF, to set the CSRF cookie name.

springdoc.swagger-ui.csrf.header-name

X-XSRF-TOKEN

String. Optional CSRF, to set the CSRF header name.

springdoc.swagger-ui.syntaxHighlight.activated

true

Boolean. Whether syntax highlighting should be activated or not.

springdoc.swagger-ui.syntaxHighlight.theme

agate

String. String=["agate"*, "arta", "monokai", "nord", "obsidian", "tomorrow-night"]. Highlight.js syntax coloring theme to use. (Only these 6 styles are available.)

springdoc.swagger-ui.oauth. useBasicAuthentication WithAccessCodeGrant

false

Boolean. Only activated for the accessCode flow. During the authorization_code request to the tokenUrl, pass the Client Password using the HTTP Basic Authentication scheme (Authorization header with Basic base64encode(client_id + client_secret)).

springdoc.swagger-ui.oauth. usePkceWithAuthorization CodeGrant

false

Boolean.Only applies to authorizatonCode flows. Proof Key for Code Exchange brings enhanced security for OAuth public clients.

6. Springdoc-openapi Plugins

6.1. Maven plugin

The aim of springdoc-openapi-maven-plugin is to generate json and yaml OpenAPI description during build time. The plugin works during integration-tests phase, and generate the OpenAPI description. The plugin works in conjunction with spring-boot-maven plugin.

You can test it during the integration tests phase using the maven command:

mvn verify

In order to use this functionality, you need to add the plugin declaration on the plugins section of your pom.xml:

<plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 <version>2.3.4.RELEASE</version>
 <configuration>
    <jvmArguments>-Dspring.application.admin.enabled=true</jvmArguments>
 </configuration>
 <executions>
  <execution>
   <id>pre-integration-test</id>
   <goals>
    <goal>start</goal>
   </goals>
  </execution>
  <execution>
   <id>post-integration-test</id>
   <goals>
    <goal>stop</goal>
   </goals>
  </execution>
 </executions>
</plugin>
<plugin>
 <groupId>org.springdoc</groupId>
 <artifactId>springdoc-openapi-maven-plugin</artifactId>
 <version>1.1</version>
 <executions>
  <execution>
   <id>integration-test</id>
   <goals>
    <goal>generate</goal>
   </goals>
  </execution>
 </executions>
</plugin>

For more custom settings of the springdoc-openapi-maven-plugin, you can consult the plugin documentation:

6.2. Gradle plugin

This plugin allows you to generate an OpenAPI 3 specification for a Spring Boot application from a Gradle build.

plugins {
      id("org.springframework.boot") version "2.3.0.RELEASE"
      id("com.github.johnrengelman.processes") version "0.5.0"
      id("org.springdoc.openapi-gradle-plugin") version "1.3.0"
}

When you add this plugin and its runtime dependency plugins to your build file, the plugin creates the following tasks:

  • forkedSpringBootRun

  • generateOpenApiDocs

gradle clean generateOpenApiDocs

For more custom configuration of springdoc-openapi-gradle-plugin ,you can consult the plugin documentation:

7. Springdoc-openapi Demos

8. Migrating from SpringFox

  • Remove springfox and swagger 2 dependencies. Add springdoc-openapi-ui dependency instead.

   <dependency>
      <groupId>org.springdoc</groupId>
      <artifactId>springdoc-openapi-ui</artifactId>
      <version>1.5.0</version>
   </dependency>
  • Replace swagger 2 annotations with swagger 3 annotations (it is already included with springdoc-openapi-ui dependency). Package for swagger 3 annotations is io.swagger.v3.oas.annotations.

    • @Api@Tag

    • @ApiIgnore@Parameter(hidden = true) or @Operation(hidden = true) or @Hidden

    • @ApiImplicitParam@Parameter

    • @ApiImplicitParams@Parameters

    • @ApiModel@Schema

    • @ApiModelProperty(hidden = true)@Schema(accessMode = READ_ONLY)

    • @ApiModelProperty@Schema

    • @ApiOperation(value = "foo", notes = "bar")@Operation(summary = "foo", description = "bar")

    • @ApiParam@Parameter

    • @ApiResponse(code = 404, message = "foo")@ApiResponse(responseCode = "404", description = "foo")

  • This step is optional: Only if you have multiple Docket beans replace them with GroupedOpenApi beans.

Before:

  @Bean
  public Docket publicApi() {
      return new Docket(DocumentationType.SWAGGER_2)
              .select()
              .apis(RequestHandlerSelectors.basePackage("org.github.springshop.web.public"))
              .paths(PathSelectors.regex("/public.*"))
              .build()
              .groupName("springshop-public")
              .apiInfo(apiInfo());
  }

  @Bean
  public Docket adminApi() {
      return new Docket(DocumentationType.SWAGGER_2)
              .select()
              .apis(RequestHandlerSelectors.basePackage("org.github.springshop.web.admin"))
              .paths(PathSelectors.regex("/admin.*"))
              .build()
              .groupName("springshop-admin")
              .apiInfo(apiInfo());
  }

Now:

  @Bean
  public GroupedOpenApi publicApi() {
      return GroupedOpenApi.builder()
              .setGroup("springshop-public")
              .pathsToMatch("/public/**")
              .build();
  }
  @Bean
  public GroupedOpenApi adminApi() {
      return GroupedOpenApi.builder()
              .setGroup("springshop-admin")
              .pathsToMatch("/admin/**")
              .build();
  }

If you have only one Docket — remove it and instead add properties to your application.properties:

springdoc.packagesToScan=package1, package2
springdoc.pathsToMatch=/v1, /api/balance/**
  • Add bean of OpenAPI type. See example:

  @Bean
  public OpenAPI springShopOpenAPI() {
      return new OpenAPI()
              .info(new Info().title("SpringShop API")
              .description("Spring shop sample application")
              .version("v0.0.1")
              .license(new License().name("Apache 2.0").url("http://springdoc.org")))
              .externalDocs(new ExternalDocumentation()
              .description("SpringShop Wiki Documentation")
              .url("https://springshop.wiki.github.org/docs"));
  }

9. Other resources

9.2. Dependencies repository

The springdoc-openapi libraries are hosted on maven central repository. The artifacts can be viewed accessed at the following locations:

Releases:

Snapshots:

10. Special Thanks

  • Thank you to The Spring Team for sharing all relevant resources around Spring projects.

  • Thanks a lot JetBrains for supporting springdoc-openapi project.

JetBrains

11. F.A.Q

11.1. How can I define multiple OpenAPI definitions in one Spring Boot project?

You can define your own groups of API based on the combination of: API paths and packages to scan. Each group should have a unique groupName. The OpenAPI description of this group, will be available by default on:

  • http://server:port/context-path/v3/api-docs/groupName

To enable the support of multiple OpenAPI definitions, a bean of type GroupedOpenApi needs to be defined.

For the following Group definition(based on package path), the OpenAPI description URL will be : /v3/api-docs/stores

@Bean
public GroupedOpenApi storeOpenApi() {
   String paths[] = {"/store/**"};
   return GroupedOpenApi.builder().group("stores").pathsToMatch(paths)
         .build();
}

For the following Group definition (based on package name), the OpenAPI description URL will be: /v3/api-docs/users

@Bean
public GroupedOpenApi userOpenApi() {
   String packagesToscan[] = {"test.org.springdoc.api.app68.api.user"};
   return GroupedOpenApi.builder().group("users").packagesToScan(packagesToscan)
         .build();
}

For the following Group definition(based on path), the OpenAPI description URL will be: /v3/api-docs/pets

@Bean
public GroupedOpenApi petOpenApi() {
   String paths[] = {"/pet/**"};
   return GroupedOpenApi.builder().group("pets").pathsToMatch(paths)
         .build();
}

For the following Group definition (based on package name and path), the OpenAPI description URL will be: /v3/api-docs/groups

@Bean
public GroupedOpenApi groupOpenApi() {
   String paths[] = {"/v1/**"};
   String packagesToscan[] = {"test.org.springdoc.api.app68.api.user", "test.org.springdoc.api.app68.api.store"};
   return GroupedOpenApi.builder().group("groups").pathsToMatch(paths).packagesToScan(packagesToscan)
         .build();
}

For more details about the usage, you can have a look at the following sample Test:

11.2. How can I configure Swagger UI?

  • The support of the swagger official properties is available on springdoc-openapi. See Official documentation.

  • You can use the same swagger properties in the documentation as Spring Boot properties.

All these properties should be declared with the following prefix: springdoc.swagger-ui

11.3. How can I filter the resources documented in the output specification by the provided group?

  • You can use the standard swagger-ui property filter.

springdoc.swagger-ui.filter=group-a

11.4. How can I disable/enable Swagger UI generation based on env variable?

  • This property helps you disable only the UI.

springdoc.swagger-ui.enabled=false

11.5. How can I control the default expansion setting for the operations and tags, in the Swagger UI ,

  • You can set this property in your application.yml like so for example:

springdoc.swagger-ui.doc-expansion= none

11.6. How can I change the layout of the swagger-ui?

  • For layout options, you can use swagger-ui configuration options. For example:

springdoc.swagger-ui.layout=BaseLayout

11.7. How can I sort endpoints alphabetically?

  • You can use the following springdoc-openapi properties:

#For sorting endpoints alphabetically
springdoc.swagger-ui.operationsSorter=alpha
#For sorting tags alphabetically
springdoc.swagger-ui.tagsSorter=alpha

11.8. How can I disable the try it out button?

  • You have to set the following property:

springdoc.swagger-ui.supportedSubmitMethods="get", "put", "post", "delete", "options", "head", "patch", "trace"

11.9. How can I add Reusable Enums ?

  • You should add @Schema(enumAsRef = true) on your enum.

11.10. How can I explicitly set which paths to filter?

  • You can set list of paths to include using the following property:

springdoc.pathsToMatch=/v1, /api/balance/**

11.11. How can I explicitly set which packages to scan?

  • You can set list of packages to include using the following property:

springdoc.packagesToScan=package1, package2

11.12. How can I ignore some field of model ?

  • You can use the following annotation on the top of the field that you want to hide:

  • @Schema(hidden = true)

11.13. How can I ignore @AuthenticationPrincipal parameter from spring-security ?

  • A solution workaround would be to use: @Parameter(hidden = true)

  • For a project that uses spring-security, you should add the following dependency, together with the springdoc-openapi-ui dependency:

<dependency>
   <groupId>org.springdoc</groupId>
   <artifactId>springdoc-openapi-security</artifactId>
   <version>last.version</version>
</dependency>

11.14. Is there a Gradle plugin available?

  • There is no springdoc-gradle-plugin planned for short term.

11.15. How can I hide a parameter from the documentation ?

  • You can use @Parameter(hidden = true)

11.16. Is @Parameters annotation supported ?

  • Yes

11.17. Does springdoc-openapi support Jersey?

11.18. Can springdoc-openapi generate API only for @RestController?

  • @RestController is equivalent to @Controller + @RequestMapping on the type level.

  • For some legacy apps, we are constrained to still support both.

  • If you need to hide the @Controller on the type level, in this case, you can use: @Hidden on controller level.

  • Please note this annotation can be also used to hide some methods from the generated documentation.

11.19. Are the following validation annotations supported : @NotEmpty @NotBlank @PositiveOrZero @NegativeOrZero?

  • Yes

11.20. How can I map Pageable (spring-date-commons) object to correct URL-Parameter in Swagger UI?

The projects that uses spring-data should add this dependency together with the springdoc-openapi-ui dependency:

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-data-rest</artifactId>
    <version>latest.version</version>
</dependency>
  • If you use Pageable in a GET HTTP method, you will have to declare the explicit mapping of Pageable fields as Query Params and add the @Parameter(hidden = true) Pageable pageable on your pageable parameter.

  • You should also, declare the annotation @PageableAsQueryParam provided by springdoc on the method level, or declare your own if need to define your custom description, defaultValue, …​

  • Since, v1.3.1 you can use as well @ParameterObject instead of @PageableAsQueryParam for HTTP GET methods.

11.21. How can I generate enums in the generated description?

  • You could add a property allowableValues, to @Parameter. For example:

@GetMapping("/example")
public Object example(@Parameter(name ="json", schema = @Schema(description = "var 1",type = "string", allowableValues = {"1", "2"}))
String json) {
   return null;
}
  • or you could override toString on your enum:

@Override
@JsonValue
public String toString() {
   return String.valueOf(action);
}

11.22. Does it really support Spring Boot 2.2.x.RELEASE & HATEOAS 1.0?

  • Yes

11.23. How can I deploy springdoc-openapi-ui behind a reverse proxy?

  • If your application is running behind a proxy, a load-balancer or in the cloud, the request information (like the host, port, scheme…​) might change along the way. Your application may be running on 10.10.10.10:8080, but HTTP clients should only see example.org.

  • RFC7239 "Forwarded Headers" defines the Forwarded HTTP header; proxies can use this header to provide information about the original request. You can configure your application to read those headers and automatically use that information when creating links and sending them to clients in HTTP 302 responses, JSON documents or HTML pages. There are also non-standard headers, like X-Forwarded-Host, X-Forwarded-Port, X-Forwarded-Proto, X-Forwarded-Ssl, and X-Forwarded-Prefix.

  • If the proxy adds the commonly used X-Forwarded-For and X-Forwarded-Proto headers, setting server.forward-headers-strategy to NATIVE is enough to support those. With this option, the Web servers themselves natively support this feature; you can check their specific documentation to learn about specific behavior.

  • You need to make sure the following header is set in your reverse proxy configuration: X-Forwarded-Prefix

  • For example, using Apache 2, configuration:

RequestHeader=set X-Forwarded-Prefix "/custom-path"
  • Then, in your Spring Boot application make sure your application handles this header: X-Forwarded-For. There are two ways to achieve this:

server.use-forward-headers=true
  • If this is not enough, Spring Framework provides a ForwardedHeaderFilter. You can register it as a Servlet Filter in your application by setting server.forward-headers-strategy is set to FRAMEWORK.

  • Since Spring Boot 2.2, this is the new property to handle reverse proxy headers:

server.forward-headers-strategy=framework
  • And you can add the following bean to your application:

@Bean
ForwardedHeaderFilter forwardedHeaderFilter() {
   return new ForwardedHeaderFilter();
}

11.24. Is @JsonView annotations in Spring MVC APIs supported?

  • Yes

11.25. Adding springdoc-openapi-ui dependency breaks my public/index.html welcome page

  • If you already have static content on your root, and you don’t want it to be overridden by springdoc-openapi-ui configuration, you can just define a custom configuration of the swagger-ui, in order not to override the configuration of your files from in your context-root:

  • For example use:

springdoc.swagger-ui.path= /swagger-ui/api-docs.html

11.27. How can I customise the OpenAPI object ?

@Bean
public OpenAPICustomiser consumerTypeHeaderOpenAPICustomiser() {
return openApi -> openApi.getPaths().values().stream().flatMap(pathItem -> pathItem.readOperations().stream())
    .forEach(operation -> operation.addParametersItem(new HeaderParameter().$ref("#/components/parameters/myConsumerTypeHeader")));
}

11.28. How to include` spring-boot-actuator` endpoints to Swagger UI?

  • In order to display spring-boot-actuator endpoints, you will need to add the following property:

springdoc.show-actuator=true

11.29. How can I return an empty content as response?

  • It is be possible to handle as return an empty content as response using, one of the following syntaxes:

  • content = @Content

  • content = @Content(schema = @Schema(hidden = true))

  • For example:

@Operation(summary = "Get thing", responses = {
      @ApiResponse(description = "Successful Operation", responseCode = "200", content = @Content(mediaType = "application/json", schema = @Schema(implementation = String.class))),
      @ApiResponse(responseCode = "404", description = "Not found", content = @Content),
      @ApiResponse(responseCode = "401", description = "Authentication Failure", content = @Content(schema = @Schema(hidden = true))) })
@RequestMapping(path = "/testme", method = RequestMethod.GET)
ResponseEntity<String> testme() {
   return ResponseEntity.ok("Hello");
}

11.30. How are endpoints with multiple consuming media types supported?

  • An overloaded method on the same class, with the same HTTP Method and path, will have as a result, only one OpenAPI Operation generated.

  • In addition, it’s recommended to have the @Operation in the level of one of the overloaded methods. Otherwise it might be overridden if it’s declared many times within the same overloaded method.

11.31. How can I get yaml and json (OpenAPI) in compile time?

11.32. What are the ignored types in the documentation?

11.33. How can i disable ignored types:

If you don’t want to ignore the types Principal, Locale, HttpServletRequest, and others,:

SpringDocUtils.getConfig().removeRequestWrapperToIgnore(HttpServletRequest.class)

11.34. How do I add authorization header in requests?

  • You should add the @SecurityRequirement tags to your protected APIs.

  • For example:

@Operation(security = { @SecurityRequirement(name = "bearer-key") })
  • And the security definition sample:

@Bean
 public OpenAPI customOpenAPI() {
   return new OpenAPI()
          .components(new Components()
          .addSecuritySchemes("bearer-key",
          new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("bearer").bearerFormat("JWT")));
}

11.35. Differentiation to Springfox project

  • OAS 3 was released in July 2017, and there was no release of springfox to support OAS 3. springfox covers for the moment only swagger 2 integration with Spring Boot. The latest release date is June 2018. So, in terms of maintenance there is a big lack of support lately.

  • We decided to move forward and share the library that we already used on our internal projects, with the community.

  • The biggest difference with springfox, is that we integrate new features not covered by springfox:

  • The integration between Spring Boot and OpenAPI 3 standard.

  • We rely on on swagger-annotations and swagger-ui only official libraries.

  • We support new features on Spring 5, like spring-webflux with annotated and functionnal style.

  • We do our best to answer all the questions and address all issues or enhancement requests

11.36. How do I migrate to OpenAPI 3 with springdoc-openapi

  • There is no relation between springdoc-openapi and springfox.If you want to migrate to OpenAPI 3:

  • Remove all the dependencies and the related code to springfox

  • Add springdoc-openapi-ui dependency

  • If you don’t want to serve the UI from your root path or there is a conflict with an existing configuration, you can just change the following property:

springdoc.swagger-ui.path=/you-path/swagger-ui.html

11.37. How can I set a global header?

  • You may have global parameters with Standard OpenAPI description.

  • If you need the definitions to appear globally (within every group), no matter if the group fulfills the conditions specified on the GroupedOpenApi , you can use OpenAPI Bean.

  • You can define common parameters under parameters in the global components section and reference them elsewhere via $ref. You can also define global header parameters.

  • For this, you can override to OpenAPI Bean, and set the global headers or parameters definition on the components level.

@Bean
public OpenAPI customOpenAPI(@Value("${springdoc.version}") String appVersion) {
 return new OpenAPI()
        .components(new Components().addSecuritySchemes("basicScheme", new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("basic"))
        .addParameters("myHeader1", new Parameter().in("header").schema(new StringSchema()).name("myHeader1")).addHeaders("myHeader2", new Header().description("myHeader2 header").schema(new StringSchema())))
        .info(new Info()
        .title("Petstore API")
        .version(appVersion)
        .description("This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.")
        .termsOfService("http://swagger.io/terms/")
        .license(new License().name("Apache 2.0").url("http://springdoc.org")));
}

11.38. Are Callbacks supported?

  • Yes

11.39. How can I define SecurityScheme ?

  • You can use: @SecurityScheme annotation.

  • Or you can define it programmatically, by overriding OpenAPI Bean:

 @Bean
 public OpenAPI customOpenAPI(@Value("${springdoc.version}") String appVersion) {
  return new OpenAPI()
   .components(new Components().addSecuritySchemes("basicScheme",
   new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("basic")))
   info(new Info().title("SpringShop API").version(appVersion)
   .license(new License().name("Apache 2.0").url("http://springdoc.org")));
 }

11.40. How can I hide an operation or a controller from documentation ?

  • You can use @io.swagger.v3.oas.annotations.Hidden annotation at @RestController, @RestControllerAdvice and method level

  • The @Hidden annotation on exception handler methods, is considered when building generic (error) responses from @ControllerAdvice exception handlers.

  • Or use: @Operation(hidden = true)

11.41. How to configure global security schemes?

  • For global SecurityScheme, you can add it inside your own OpenAPI definition:

@Bean
public OpenAPI customOpenAPI() {
    return new OpenAPI().components(new Components()
    .addSecuritySchemes("basicScheme", new SecurityScheme()
    .type(SecurityScheme.Type.HTTP).scheme("basic"))).info(new Info().title("Custom API")
    .version("100")).addTagsItem(new Tag().name("mytag"));
}

11.42. Can I use spring property with swagger annotations?

  • The support of spring property resolver for @Info: title * description * version * termsOfService

  • The support of spring property resolver for @Info.license: name * url

  • The support of spring property resolver for @Info.contact: name * email * url

  • The support of spring property resolver for @Operation: description * summary

  • The support of spring property resolver for @Parameter: description * name

  • The support of spring property resolver for @ApiResponse: description

  • Its also possible to declare security URLs for @OAuthFlow: openIdConnectUrl * authorizationUrl * refreshUrl * tokenUrl

  • The support of spring property resolver for @Schema: name * title * description , by setting springdoc.api-docs.resolve-schema-properties to true === How can I disable springdoc-openapi cache?

  • By default, the OpenAPI description is calculated once, and then cached.

  • Sometimes the same swagger-ui is served behind internal and external proxies. some users want the server URL, to be computed on each http request.

  • In order to disable springdoc cache, you will have to set the following property:

springdoc.cache.disabled= true

11.43. How is server URL generated ?

  • Generating automatically server URL may be useful, if the documentation is not present.

  • If the server annotations are present, they will be used instead.

11.44. How can I expose the api-docs endpoints without using the swagger-ui?

  • You should use the springdoc-openapi-core dependency only:

<dependency>
  <groupId>org.springdoc</groupId>
  <artifactId>springdoc-openapi-core</artifactId>
  <version>latest.version</version>
</dependency>

11.45. How can I disable springdoc-openapi endpoints ?

  • Use the following property:

springdoc.api-docs.enabled=false

11.46. How can I hide Schema of the the response ?

  • To hide the response element, using @Schema annotation, as follows, at operation level:

@Operation(responses = @ApiResponse(responseCode = "200", content = @Content(schema = @Schema(hidden = true))))
  • Or directly at @ApiResponses level:

@ApiResponses(value = {@ApiResponse(responseCode = "200", content = @Content(schema = @Schema(hidden = true))) })
OR
@ApiResponse(responseCode = "404", description = "Not found", content = @Content)

11.47. What is the URL of the swagger-ui, when I set a different context-path?

  • If you use different context-path:

server.servlet.context-path= /foo
  • The swagger-ui will be available on the following URL:

    • http://server:port/foo/swagger-ui.html

11.48. Can I customize OpenAPI object programmatically?

  • You can Define your own OpenAPI Bean: If you need the definitions to appear globally (within every group), no matter if the group fulfills the conditions specified on the GroupedOpenApi , you can use OpenAPI Bean.

@Bean
public OpenAPI customOpenAPI(@Value("${springdoc.version}") String appVersion) {
   return new OpenAPI()
    .components(new Components().addSecuritySchemes("basicScheme",
            new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("basic")))
    .info(new Info().title("SpringShop API").version(appVersion)
            .license(new License().name("Apache 2.0").url("http://springdoc.org")));
}
  • If you need the definitions to appear within a specific group, and respect the conditions specified on the GroupedOpenApi, you can add OpenApiCustomiser to your GroupedOpenApi definition.

GroupedOpenApi.builder().group("users").pathsToMatch(paths).packagesToScan(packagedToMatch).addOpenApiCustomiser(customerGlobalHeaderOpenApiCustomiser())
                .build()

@Bean
public OpenApiCustomiser customerGlobalHeaderOpenApiCustomiser() {
   return openApi -> openApi.path("/foo",
   new PathItem().get(new Operation().operationId("foo").responses(new ApiResponses()
   .addApiResponse("default",new ApiResponse().description("")
   .content(new Content().addMediaType("fatz", new MediaType()))))));
}

11.49. Where can I find the source code of the demo applications?

11.50. Does this library supports annotations from interfaces?

  • Yes

11.52. Is file upload supported ?

  • The library supports the main file types: MultipartFile, @RequestPart, FilePart

11.53. Can I use @Parameter inside @Operation annotation?

  • Yes, it’s supported

11.54. Why my parameter is marked as required?

  • Any @GetMapping parameters is marked as required, even if @RequestParam is missing.

  • You can add @Parameter(required=false) annotation if you need different behaviour.

  • Query parameters with defaultValue specified are marked as required.

11.55. How are overloaded methods with the same endpoints, but with different parameters

  • springdoc renders these methods as a single endpoint. It detects the overloaded endpoints, and generates parameters.schema.oneOf.

11.56. What is a proper way to set up Swagger UI to use provided spec.yml?

  • With this property, all the springdoc-openapi auto configuration beans are disabled:

springdoc.api-docs.enabled=false
  • Then enable the minimal beans configuration, by adding this Bean:

@Bean
SpringDocConfiguration springDocConfiguration(){
   return new SpringDocConfiguration();
}
@Bean
public SpringDocConfigProperties springDocConfigProperties() {
   return new SpringDocConfigProperties();
}
  • Then configure, the path of your custom UI yaml file.

springdoc.swagger-ui.url=/api-docs.yaml

11.57. Is there a way to send authorization header through the @Parameter tag?

11.58. My Rest Controller using @Controller annotation is ignored?

  • This is the default behaviour if your @Controller doesn’t have annotation @ResponseBody

  • You can change your controllers to @RestControllers. Or add @ResponseBody + @Controller.

  • If its not possible, you can configure springdoc to scan you additional controller using SpringDocUtils. For example:

static {
   SpringDocUtils.getConfig().addRestControllers(HelloController.class);
}

11.59. How can I define groups using application.yml?

  • You can load groups dynamically using spring-boot configuration files.

  • Note that, for this usage, you don’t have to declare the GroupedOpenApi Bean.

  • You need to declare the following properties, under the prefix springdoc.group-configs.

  • For example:

springdoc.group-configs[0].group=users
springdoc.group-configs[0].paths-to-match=/user/**
springdoc.group-configs[0].packages-to-scan=test.org.springdoc.api

11.60. How can I extract fields from parameter object ?

  • You can use springdoc annotation @ParameterObject.

  • Request parameter annotated with @ParameterObject will help adding each field of the parameter as a separate request parameter.

  • This is compatible with Spring MVC request parameters mapping to POJO object.

  • This annotation does not support nested parameter objects.

11.61. How to Integrate Open API 3 with Spring project (not Spring Boot)?

When your application is using spring without (spring-boot), you need to add beans and auto-configuration that are natively provided in spring-boot.

For example, lets assume you want load the swagger-ui in spring-mvc application:

  • You mainly, need to add the springdoc-openapi module

<dependency>
   <groupId>org.springdoc</groupId>
   <artifactId>springdoc-openapi-ui</artifactId>
   <version>last.version</version>
</dependency>
  • If you don’t have the spring-boot and spring-boot-autoconfigure dependencies, you need to add them. And pay attention to the compatibility matrix, between you spring.version and spring-boot.version. For example, in this case (spring.version=5.1.12.RELEASE):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot</artifactId>
    <version>2.1.11.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
    <version>2.1.11.RELEASE</version>
</dependency>
  • Scan for the springdoc auto-configuration classes that spring-boot automatically loads for you.

  • Depending on your module, you can find them on the file: spring.factories of each springdoc-openapi module.

@EnableWebMvc
public class AppInitializer implements WebApplicationInitializer {

   @Override
   public void onStartup(ServletContext servletContext) throws ServletException {
      WebApplicationContext context = getContext();
      servletContext.addListener(new ContextLoaderListener(context));
      ServletRegistration.Dynamic dispatcher = servletContext.addServlet("RestServlet",
            new DispatcherServlet(context));
      dispatcher.setLoadOnStartup(1);
      dispatcher.addMapping("/*");
   }

   private AnnotationConfigWebApplicationContext getContext() {
      AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
      context.scan("rest");
      context.register(this.getClass(), org.springdoc.ui.SwaggerConfig.class,
            org.springdoc.core.SwaggerUiConfigProperties.class, org.springdoc.core.SwaggerUiOAuthProperties.class,
            org.springdoc.webmvc.core.SpringDocWebMvcConfiguration.class,
            org.springdoc.webmvc.core.MultipleOpenApiSupportConfiguration.class,
            org.springdoc.core.SpringDocConfiguration.class, org.springdoc.core.SpringDocConfigProperties.class,
            org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration.class);

      return context;
   }
}

11.62. How can I use the last springdoc-openapi SNAPSHOT ?

  • For testing purposes only, you can test temporarly using the last springdoc-openapi SNAPSHOT

  • To achieve that, you can on your pom.xml or your settings.xml the following section:

     <repositories>
       <repository>
         <id>snapshots-repo</id>
         <url>https://oss.sonatype.org/content/repositories/snapshots</url>
         <releases><enabled>false</enabled></releases>
         <snapshots><enabled>true</enabled></snapshots>
       </repository>
     </repositories>

11.63. How can I use enable springdoc-openapi MonetaryAmount support ?

  • If an application wants to enable the springdoc-openapi support, it declares:

SpringDocUtils.getConfig().replaceWithClass(MonetaryAmount.class, org.springdoc.core.converters.MonetaryAmount.class);
  • Another solution, without using springdoc-openapi MonetaryAmount, would be:

SpringDocUtils.getConfig().replaceWithSchema(MonetaryAmount.class, new ObjectSchema()
            .addProperties("amount", new NumberSchema()).example(99.96)
            .addProperties("currency", new StringSchema().example("USD")));

11.64. How can i agreagte external endpoints (exposing OPENAPI 3 spec) inside one single application?

The properties springdoc.swagger-ui.urls.*, are suitable to configure external (/v3/api-docs url). For example if you want to agreagte all the endpoints of other services, inside one single application. IMPORTANT: Don’t forget that CORS needs to be enabled as well.

11.65. How can use custom json/yml file instead of generated one ?

If your file open-api.json, contains the OpenAPI documentation in OpenAPI 3 format. Then simply declare: The file name can be anything you want, from the moment your declaration is consistent yaml or json OpenAPI Spec.

   springdoc.swagger-ui.url=/open-api.json

Then the file open-api.json, should be located in: src/main/resources/static No additional configuration is needed.

11.66. How can i enable CSRF support?

If you are using standard headers.(for example using spring-security headers) If the CSRF Token is required, swagger-ui automatically sends the new XSRF-TOKEN during each HTTP REQUEST.

If your XSRF-TOKEN isn’t standards-based, you can use a requestInterceptor to manually capture and attach the latest xsrf token to requests programmatically via spring resource transformer:

Starting from release v1.4.4 of springdoc-openapi, a new property is added to enable CSRF support, while using standard header names:

springdoc.swagger-ui.csrf.enabled=true

11.67. How can i disable the default swagger petstore URL?

You can use the following property:

springdoc.swagger-ui.disable-swagger-default-url=true

11.68. Is @PageableDefault supported, to enhance the OpenAPI 3 docuementation?

Yes, you can use it in conjunction with @ParameterObject annotation. Also, the spring-boot spring.data.web. and spring.data.rest.default. properties are supported since v1.4.5

11.69. How can i make spring security login-endpoint visible ?

You can use the following property:

springdoc.show-login-endpoint=true

11.70. How can i show schema definitions even the schema is not referenced?

You can use the following property:

springdoc.remove-broken-reference-definitions=false

11.71. How can i disable the swagger-ui from loading twince?

You can try the following property (if not using Oauth): This resolves a bug on swagger-ui where it loads some resources twice if using configurl as query parameter.

springdoc.swagger-ui.display-query-params-without-oauth2=true

Or if using Oauth2:

springdoc.swagger-ui.display-query-params = true

11.72. How to override @Deprecated?

The whole idea of springdoc-openapi is to get your documentation the closest to the code, with minimal code changes. If the code contains @Deprecated, sprindoc-openapi will consider its schema as Deprecated as well. If you want to declare a field on swagger as non deprecated, even with the java code, the field contains @Depreacted, You can use the following property that is available since release v1.4.3:

springdoc.model-converters.deprecating-converter.enabled=false

11.73. How can i display a method that returns ModelAndView?

You can use the following property:

springdoc.model-and-view-allowed=true

11.74. How can i have pretty-printed output of the OpenApi specification?

You can use the following property:

springdoc.writer-with-default-pretty-printer=true