SpringOpenApiDocs
SpringOpenApiDocs
1. Introduction
springdoc-openapi java library helps to automate 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.
OpenAPI 3
Swagger-ui
OAuth 2
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-starter-webmvc-ui</artifactId>
<version>2.6.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
Documentation can be available in yaml format as well, on the following path : /v3/api-docs.yaml
For custom path of the swagger documentation in HTML format, add a custom springdoc property, in your spring-boot
configuration file: .
3. Springdoc-openapi Modules
Documentation will be available at the following url for json format: http://server:port/context-path/v3/api-docs
Documentation will be available in yaml format as well, on the following path : /v3/api-docs.yaml
Add the library to the list of your project dependencies. (No additional configuration is needed)
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
<version>2.6.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:
Documentation can be available in yaml format as well, on the following path : /v3/api-docs.yaml
Add the library to the list of your project dependencies (No additional configuration is needed)
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webflux-api</artifactId>
<version>2.6.0</version>
</dependency>
The support for Spring Hateoas is available using the dependency springdoc-openapi-hateoas.
springdoc.show-actuator=true
Starting from the release 1.5.1 , it will be possible to expose the swagger-ui and the openapi endpoints on actuator port.
The actuator management port has to be different from the application port.
springdoc.use-management-port=true
# This property enables the openapi and swagger-ui endpoints to be exposed beneath the actuator base path.
management.endpoints.web.exposure.include=openapi, swagger-ui
Once enabled, you should also be able to see the springdoc-openapi endpoints under: (host and port depends on your
settings) - http://serverName:managementPort/actuator
http://serverName:managementPort/actuator/openapi
http://serverName:managementPort/actuator/swagger-ui
management.server.port=9090
For the example, you should also be able to see the springdoc-openapi endpoints:
http://serverName:9090/actuator
http://serverName:9090/actuator/swagger-ui
http://serverName:9090/actuator/openapi
All the path springdoc-openapi properties are not applicable when springdoc.use-management-port=true .
If you want to reach the application endpoints, from the swagger-ui deployed beneath the actuator base path, using a
different port from your application, CORS for your endpoints on your application level should be enabled.
Additionally, it is also possible to combine this property, with the existing property to display the actuator endpoints in the
swagger-ui.
springdoc.show-actuator=true
Once enabled: - A dedicated group for the actuator endpoints will be by default added. - If no group is defined for the
application, a default one will be added.
http://serverName:managementPort/actuator/swagger-ui
If the management port is different from the application port and springdoc.use-management-port is not defined but
springdoc.show-actuator is set to true:
The swagger-ui will be then accessible through the application port. For example:
http://serverName:applicationPort/swagger-ui.html
Note: The naming of these new endpoints beneath the actuator base path cannot be customized for now.
spring-cloud-function-web exposes Java Function as REST endpoint automatically. * Since version v1.6.3 , the support of
functional endpoints has been added.
These starters will display the OpenAPI description of the spring-cloud-function-web endpoints.
The customisation of the output can be achieved programmatically through OpenApiCustomizer or with the annotations:
@RouterOperations and @RouterOperation . For annotation usage, you have: * @RouterOperation : It can be used alone, if
the customisation is related to a single REST API. When using @RouterOperation , it’s not mandatory to fill the path
@RouterOperation , contains the @Operation annotation. The @Operation annotation can also be placed on the bean
method level if the property beanMethod is declared.
@Bean
@RouterOperation(operation = @Operation(description = "Say hello", operationId = "hello", tags = "persons",
responses = @ApiResponse(responseCode = "200", content = @Content(schema = @Schema(implementation =
public Supplier<PersonDTO> helloSupplier() {
return () -> new PersonDTO();
}
@RouterOperations : This annotation should be used to describe the multiple REST APIs exposed by spring-cloud-
function-web . When using RouterOperations , it’s mandatory to fill the method property.
@Bean
@RouterOperations({
@RouterOperation(method = RequestMethod.GET, operation = @Operation(description = "Say hello GET",
@RouterOperation(method = RequestMethod.POST, operation = @Operation(description = "Say hello POST"
})
public Function<Flux<String>, Flux<String>> lowercase() {
return flux -> flux.map(value -> value.toLowerCase());
}
In addition, your project should add jackson-module-kotlin as well to have the full support of Kotlin types:
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
</dependency>
The javadoc comment of an attribute: is resolved as ‘@Schema’ description for this field.
In addition, your project should add therapi-runtime-javadoc to read Javadoc comments at runtime. Ensure that you add it
as well as its annotation processor to your project’s dependencies. Otherwise, the Javadoc support will fail silently.
If both a swagger-annotation description and a javadoc comment are present. The value of the swagger-annotation
description will be used.
4. Springdoc-openapi Features
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.
To generate documentation automatically, make sure all the methods declare the HTTP Code responses using the annotation:
@ResponseStatus
In order to disable the springdoc-openapi endpoint (/v3/api-docs by default) use the following property:
You need to declare swagger-ui properties as spring-boot properties. All these properties should be declared with the
following prefix: springdoc.swagger-ui
Additionally, to @Hidden annotation from swagger-annotations, its possible to restrict the generated OpenAPI description
using package or path configuration.
# Packages to include
springdoc.packagesToScan=com.package1, com.package2
# Paths to include
springdoc.pathsToMatch=/v1, /api/balance/**
Since version v1.5.0, a functional DSL has been introduced, thanks to this enhancement in the spring-framework: #25938
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 descriptio
.response(responseBuilder().responseCode("404").description("This is another response descripti
).build();
}
HelloRouter
QuotesRouter
BookRouter
EmployeeRouter
PositionRouter
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.
@Bean
@RouterOperation(operation = @Operation(operationId = "findEmployeeById", summary = "Find purchase order by
parameters = { @Parameter(in = ParameterIn.PATH, name = "id", description = "Employee Id") },
responses = { @ApiResponse(responseCode = "200", description = "successful operation", content = @Con
@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.
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
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.
Parameter name
Default Value
Description
springdoc.api-docs.path
/v3/api-docs
springdoc.api-docs.enabled
true
springdoc.packages-to-scan
springdoc.paths-to-match
/*
springdoc.produces-to-match
/*
List of Strings . The list of produces mediaTypes to match (comma separated)
springdoc.headers-to-match
/*
springdoc.consumes-to-match
/*
springdoc.paths-to-exclude
springdoc.packages-to-exclude
springdoc.default-consumes-media-type
application/json
springdoc.default-produces-media-type
**/**
springdoc.cache.disabled
false
springdoc.show-actuator
false
springdoc.auto-tag-classes
true
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.group-configs[0].group
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
/*
springdoc.group-configs[0].consumes-to-match
/*
springdoc.group-configs[0].headers-to-match
/*
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
springdoc.remove-broken-reference-definitions
true
springdoc.writer-with-default-pretty-printer
false
true
springdoc.model-converters.polymorphic-converter.enabled
true
springdoc.model-converters.pageable-converter.enabled
true
springdoc.model-converters.sort-converter.enabled
true
springdoc.use-fqn
false
springdoc.show-login-endpoint
false
springdoc.pre-loading-locales
List of Strings . The list of locales to load OpenAPI on application startup (comma separated). If not specified, it will
preload with the default Locale.
springdoc.writer-with-order-by-keys
false
springdoc.use-management-port
false
springdoc.disable-i18n
false
springdoc.show-spring-cloud-functions
true
springdoc.enable-groovy
true
springdoc.enable-spring-security
true
springdoc.enable-kotlin
true
springdoc.enable-hateoas
true
springdoc.enable-data-rest
true
springdoc.api-docs.version
openapi_3_0
String . To choose OpenAPI 3.0 or OpenAPI 3.1 (using the value OPENAPI_3_1 ).
springdoc.default-flat-param-object
false
springdoc.default-support-form-data
false
Boolean . To default set parameters to form data when specifying api to accept form data.
springdoc.nullable-request-parameter-enabled
true
springdoc.show-oauth2-endpoints
false
springdoc.api-docs.resolve-extensions-properties
false
springdoc.enable-default-api-docs
true
Boolean . To enable default OpenAPI endpoint /v3/api-docs .
springdoc.trim-kotlin-indent
false
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
springdoc.swagger-ui.enabled
true
springdoc.swagger-ui.configUrl
/v3/api-docs/swagger-config
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
By default, Swagger UI does not validate specs. You can use this parameter to set a validator URL, for example for against
swagger.io’s online validator.
springdoc.swagger-ui.tryItOutEnabled
false
Boolean . Controls whether the “Try it out” section should be enabled by default.
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
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 for more
information.
springdoc.swagger-ui.defaultModelsExpandDepth
Number . The default expansion depth for models (set to -1 completely hide the models).
springdoc.swagger-ui.defaultModelExpandDepth
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.queryConfigEnabled
false
Boolean . Disabled since v1.6.0 . This parameter enables (legacy) overriding configuration parameters via URL search
params. See security advisory before enabling this feature.
springdoc.swagger-ui.oauth. additionalQueryStringParams
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
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 scope separator for passing scopes, encoded before calling, default value is a space (encoded value %20).
springdoc.swagger-ui.csrf.enabled
false
springdoc.swagger-ui.csrf.use-local-storage
false
springdoc.swagger-ui.csrf.use-session-storage
false
springdoc.swagger-ui.csrf.cookie-name
XSRF-TOKEN
springdoc.swagger-ui.csrf.header-name
X-XSRF-TOKEN
springdoc.swagger-ui.syntaxHighlight.activated
true
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.)
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)).
false
Boolean .Only applies to authorizatonCode flows. Proof Key for Code Exchange brings enhanced security for OAuth public
clients.
springdoc.swagger-ui.persistAuthorization
false
Boolean . If set to true, it persists authorization data and it would not be lost on browser close/refresh
springdoc.swagger-ui.use-root-path
false
Boolean . If set to true, the swagger-ui will be accessible from the application root path directly.
6. Springdoc-openapi Plugins
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>${spring-boot-maven-plugin.version}</version>
<configuration>
<jvmArguments>-Dspring.application.admin.enabled=true</jvmArguments>
</configuration>
<executions>
<execution>
<goals>
<goal>start</goal>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-maven-plugin</artifactId>
<version>1.4</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:
https://github.com/springdoc/springdoc-openapi-maven-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 "3.1.2"
id("org.springdoc.openapi-gradle-plugin") version "1.9.0"
}
When you add this plugin and its runtime dependency plugins to your build file, the plugin creates the following tasks:
forkedSpringBootRun
generateOpenApiDocs
For more custom configuration of springdoc-openapi-gradle-plugin ,you can consult the plugin documentation:
https://github.com/springdoc/springdoc-openapi-gradle-plugin
7. Springdoc-openapi Demos
https://github.com/springdoc/springdoc-openapi-demos/tree/master
All the modules have been renamed. springdoc-openapi-starter-common integrates many spring modules support in order
to hide the maximum of complexity. It allows the support out of the box for Actuator / Spring Cloud Function / Spring
Data Rest / Spring Native / Spring Hateoas / Spring Securtiy / Kotlin / Javadoc .
The following table describes the main modules changes:
springdoc-openapi-v1
springdoc-openapi-v2
Description
springdoc-openapi-common
springdoc-openapi-starter-common
springdoc-openapi-data-rest
springdoc-openapi-starter-common
springdoc-openapi-groovy
springdoc-openapi-starter-common
springdoc-openapi-hateoas
springdoc-openapi-starter-common
springdoc-openapi-javadoc
springdoc-openapi-starter-common
springdoc-openapi-kotlin
springdoc-openapi-starter-common
springdoc-openapi-security
springdoc-openapi-starter-common
springdoc-openapi-webmvc-core
springdoc-openapi-starter-webmvc-api
springdoc-openapi-webflux-core
springdoc-openapi-starter-webflux-api
springdoc-openapi-ui
springdoc-openapi-starter-webmvc-ui
springdoc-openapi-starter-webflux-ui
classes/annotations changes
springdoc-openapi-v1
springdoc-openapi-v2
org.springdoc.core.SpringDocUtils
org.springdoc.core.utils.SpringDocUtils
org.springdoc.api.annotations.ParameterObject
org.springdoc.core.annotations.ParameterObject
org.springdoc.core.GroupedOpenApi
org.springdoc.core.models.GroupedOpenApi
org.springdoc.core.customizers.OpenApiCustomiser
org.springdoc.core.customizers.OpenApiCustomizer
org.springdoc.core.Constants
org.springdoc.core.utils.Constants
org.springdoc.core.SwaggerUiConfigParameters
org.springdoc.core.properties.SwaggerUiConfigParameters
Migration tips
The following modules are not anymore needed and can be removed:
springdoc-openapi-javadoc
springdoc-openapi-kotlin
springdoc-openapi-data-rest
springdoc-openapi-security
springdoc-openapi-webmvc-core
springdoc-openapi-webflux-core
springdoc-openapi-hateoas
springdoc-openapi-groovy
In addition:
Replace swagger 2 annotations with swagger 3 annotations (it is already included with springdoc-openapi-starter-
webmvc-ui dependency). Package for swagger 3 annotations is io.swagger.v3.oas.annotations .
@Api → @Tag
@ApiImplicitParam → @Parameter
@ApiImplicitParams → @Parameters
@ApiModel → @Schema
@ApiModelProperty → @Schema
@ApiParam → @Parameter
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.*"))
.apis(RequestHandlerSelectors.withMethodAnnotation(Admin.class))
.build()
.groupName("springshop-admin")
.apiInfo(apiInfo());
}
Now:
@Bean
public GroupedOpenApi publicApi() {
return GroupedOpenApi.builder()
.group("springshop-public")
.pathsToMatch("/public/**")
.build();
}
@Bean
public GroupedOpenApi adminApi() {
return GroupedOpenApi.builder()
.group("springshop-admin")
.pathsToMatch("/admin/**")
.addOpenApiMethodFilter(method -> method.isAnnotationPresent(Admin.class))
.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/**
@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"));
}
how-can-i-deploy-springdoc-openapi-starter-webmvc-ui-behind-a-reverse-proxy
how-can-i-configure-swagger-ui
how-can-i-hide-an-operation-or-a-controller-from-documentation
Springdoc-openapi presentation
Baeldung
DZone Part1
DZone Part2
Piotrminkowski Blog
Releases:
https://s01.oss.sonatype.org/content/groups/public/org/springdoc/
Snapshots:
https://s01.oss.sonatype.org/content/repositories/snapshots/org/springdoc/
13. F.A.Q
13.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.st
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:
https://github.com/springdoc/springdoc-openapi/tree/main/springdoc-openapi-tests/springdoc-openapi-actuator-
webmvc-tests/src/test/java/test/org/springdoc/api/app68
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
13.3. How can I filter the resources documented in the output specification by the provided group?
springdoc.swagger-ui.filter=group-a
springdoc.swagger-ui.enabled=false
13.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
For layout options, you can use swagger-ui configuration options. For example:
springdoc.swagger-ui.layout=BaseLayout
static {
io.swagger.v3.core.jackson.ModelResolver.enumsAsRef = true;
}
You can set list of paths to include using the following property:
springdoc.pathsToMatch=/v1, /api/balance/**
You can set list of packages to include using the following property:
springdoc.packagesToScan=package1, package2
@Bean
@Primary
fun swaggerUiConfig(config: SwaggerUiConfigProperties): SwaggerUiConfigProperties {
config.showCommonExtensions = true
config.queryConfigEnabled = true
return config
}
You can use the following annotation on the top of the field that you want to hide:
@Schema(hidden = true)
Yes
If you are using JAX-RS and as implementation Jersey ( @Path for example), we do not support it.
We only support exposing Rest Endpoints using Spring managed beans ( @RestController for example).
https://github.com/swagger-api/swagger-samples/tree/2.0/java/java-jersey2-minimal
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.
13.21. Are the following validation annotations supported : @NotEmpty @NotBlank @PositiveOrZero
@NegativeOrZero ?
Yes
13.22. How can I map Pageable (spring-data-commons) object to correct URL-Parameter in Swagger UI?
The support for Pageable of spring-data-commons is available out-of-the box since springdoc-openapi v1.6.0 . For this, you
have to combine @ParameterObject annotation with the Pageable type.
You can use as well @ParameterObject instead of @PageableAsQueryParam for HTTP GET methods.
static {
getConfig().replaceParameterObjectWithClass(org.springframework.data.domain.Pageable.class, Pageable.cl
.replaceParameterObjectWithClass(org.springframework.data.domain.PageRequest.class, Pageable.cl
}
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-openapi on the
method level, or declare your own if need to define your custom description, defaultValue, …
If you want to disable the support of spring Pageable Type, you can use:
springdoc.model-converters.pageable-converter.enabled=false
@GetMapping("/example")
public Object example(@Parameter(name ="json", schema = @Schema(description = "var 1",type = "string", allo
String json) {
return null;
}
@Override
@JsonValue
public String toString() {
return String.valueOf(action);
}
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
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
@Bean
ForwardedHeaderFilter forwardedHeaderFilter() {
return new ForwardedHeaderFilter();
}
If you need to manually adjust the URL displayed in the Swagger UI, implement the ServerBaseUrlCustomizer
interface. This might be necessary to remove the port number, for example.
@Bean
public class CustomServerBaseUrlCustomizer implements ServerBaseUrlCustomizer {
@Override
public String customize(String serverBaseUrl) {
try {
URL url = new URL(serverBaseUrl);
if (url.getHost().contains(".com")) {
serverBaseUrl = new URL(url.getProtocol(),url.getHost(),url.getFile()).toString();
}
} catch (MalformedURLException ex) {
// nothing we can do
}
return serverBaseUrl;
}
}
Yes
If you already have static content on your root, and you don’t want it to be overridden by springdoc-openapi-starter-
webmvc-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:
springdoc.swagger-ui.path= /swagger-ui/api-docs.html
https://github.com/springdoc/springdoc-openapi/blob/main/springdoc-openapi-starter-webmvc-
ui/src/test/java/test/org/springdoc/ui/app1/SpringDocApp1Test.java
https://github.com/springdoc/springdoc-openapi/blob/main/springdoc-openapi-starter-webflux-
api/src/test/java/test/org/springdoc/api/app39/SpringDocTestApp.java
@Bean
public OpenApiCustomizer consumerTypeHeaderOpenAPICustomizer() {
return openApi -> openApi.getPaths().values().stream().flatMap(pathItem -> pathItem.readOperations().stream
.forEach(operation -> operation.addParametersItem(new HeaderParameter().$ref("#/components/parameters/m
}
If you need the OpenApiCustomizer to applied to GroupedOpenApi as well, then use GlobalOpenApiCustomizer instead.
It is be possible to handle as return an empty content as response using, one of the following syntaxes:
content = @Content
For example:
13.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.
13.31. How can I get yaml and json (OpenAPI) in compile time?
https://github.com/springdoc/springdoc-openapi-maven-plugin.git
You can customise the output directory (property outputDir): The default value is: ${project.build.directory}
Principal , Locale , HttpServletRequest and HttpServletResponse and other injectable parameters supported by
Spring MVC are excluded.
https://docs.spring.io/spring/docs/5.1.x/spring-framework-reference/web.html#mvc-ann-arguments
If you don’t want to ignore the types Principal , Locale , HttpServletRequest , and others,:
SpringDocUtils.getConfig().removeRequestWrapperToIgnore(HttpServletRequest.class)
For example:
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.components(new Components()
.addSecuritySchemes("bearer-key",
new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("bearer").bearerFormat("JWT")));
}
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 :
We support new features on Spring 5, like spring-webflux with annotated and functional style.
We do our best to answer all the questions and address all issues or enhancement requests
There is no relation between springdoc-openapi and springfox .If you want to migrate to OpenAPI 3:
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
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(SecuritySc
.addParameters("myHeader1", new Parameter().in("header").schema(new StringSchema()).name("myHeader1
.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
.termsOfService("http://swagger.io/terms/")
.license(new License().name("Apache 2.0").url("http://springdoc.org")));
}
Yes
@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")));
}
The @Hidden annotation on exception handler methods, is considered when building generic (error) responses from
@ControllerAdvice exception handlers.
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"));
}
The support of spring property resolver for @Info : title * description * version * termsOfService
The support of spring property resolver for @Info.contact : name * email * url
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
Generating automatically server URL may be useful, if the documentation is not present.
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
13.45. How can I expose the mvc api-docs endpoints without using the swagger-ui ?
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
<version>latest.version</version>
</dependency>
springdoc.api-docs.enabled=false
13.48. What is the URL of the swagger-ui , when I set a different context-path?
server.servlet.context-path= /foo
http://server:port/foo/swagger-ui.html
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 OpenApiCustomizer to your GroupedOpenApi definition.
GroupedOpenApi.builder().group("users").pathsToMatch(paths).packagesToScan(packagedToMatch).addOpenApiCusto
.build()
@Bean
public OpenApiCustomizer customerGlobalHeaderOpenApiCustomizer() {
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()))))));
}
13.50. Where can I find the source code of the demo applications?
The source code of the application is available at the following GitHub repository:
https://github.com/springdoc/springdoc-openapi-demos
Yes
13.52. What is the list of the excluded parameter types?
https://docs.spring.io/spring/docs/5.1.x/spring-framework-reference/web.html#mvc-ann-arguments.
The library supports the main file types: MultipartFile , @RequestPart , FilePart
13.56. How are overloaded methods with the same endpoints, but with different parameters
springdoc-openapi renders these methods as a single endpoint. It detects the overloaded endpoints, and generates
parameters.schema.oneOf.
With this property, all the springdoc-openapi auto-configuration beans are disabled:
springdoc.api-docs.enabled=false
@Bean
SpringDocConfiguration springDocConfiguration(){
return new SpringDocConfiguration();
}
@Bean
SpringDocConfigProperties springDocConfigProperties() {
return new SpringDocConfigProperties();
}
@Bean
ObjectMapperProvider objectMapperProvider(SpringDocConfigProperties springDocConfigProperties){
return new ObjectMapperProvider(springDocConfigProperties);
}
@Bean
SpringDocUIConfiguration SpringDocUIConfiguration(Optional<SwaggerUiConfigProperties> optionalSwaggerUiConf
return new SpringDocUIConfiguration(optionalSwaggerUiConfigProperties);
}
springdoc.swagger-ui.url=/api-docs.yaml
13.58. Is there a way to send authorization header through the @Parameter tag?
The OpenAPI 3 specification does not allow explicitly adding Authorization header. Note: Header parameters named
Accept, Content-Type and Authorization are not allowed. To describe these headers
https://swagger.io/docs/specification/describing-parameters/#header-parameters
This is the default behaviour if your @Controller doesn’t have annotation @ResponseBody
If its not possible, you can configure springdoc to scan you additional controller using SpringDocUtils. For example:
static {
SpringDocUtils.getConfig().addRestControllers(HelloController.class);
}
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
springdoc-openapi-properties
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.
POJO object must contain getters for fields with mandatory prefix get . Otherwise, the swagger documentation will not
show the fields of the annotated entity.
For testing purposes only, you can test temporarily 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://s01.oss.sonatype.org/content/repositories/snapshots</url>
<releases><enabled>false</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
SpringDocUtils.getConfig().replaceWithClass(MonetaryAmount.class, org.springdoc.core.converters.models.Mone
13.64. How can i aggregate 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.
13.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.
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:
https://github.com/swagger-api/swagger-ui/blob/main/docs/usage/configuration.md#requestinterceptor
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
springdoc.swagger-ui.disable-swagger-default-url=true
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
springdoc.show-login-endpoint=true
13.70. How can i show schema definitions even the schema is not referenced?
springdoc.remove-broken-reference-definitions=false
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
springdoc.model-and-view-allowed=true
13.74. How can i define different schemas for the same class?
Complex objects are always resolved as a reference to a schema defined in components. For example let’s consider a
Instance class with an workAddress and homeAddress attribute of type Address :
@JsonProperty
private String email;
@JsonProperty
private String firstName;
@JsonProperty
private String lastName;
@Schema(ref = "WorkAddressSchema")
@JsonProperty
private Address workAddress;
@Schema(ref = "HomeAddressSchema")
@JsonProperty
private Address homeAddress;
@JsonProperty
private String addressName;
If you want to define two different schemas for this class, you can set up 2 different schemas as follow:
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI().components(new Components()
.addSchemas("WorkAddressSchema", getSchemaWithDifferentDescription(Address.class, "work Address" ))
.addSchemas("HomeAddressSchema", getSchemaWithDifferentDescription(Address.class, "home Address" )));
}
13.75. How can i define different description for a class attribute depending on usage?
@JsonProperty
private String email;
@JsonProperty
private String firstName;
@JsonProperty
private String lastName;
If you want to define two different description for the email , you can set up 2 different schemas as follow:
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI().components(new Components()
.addSchemas("PersonDTO1", getFieldSchemaWithDifferentDescription(PersonDTO.class, "work email" ))
.addSchemas("PersonDTO2", getFieldSchemaWithDifferentDescription(PersonDTO.class, "home email" )));
}
index.html
swagger-ui-bundle.js
swagger-ui.css
swagger-ui-standalone-preset.js
swagger-ui.css.map
swagger-ui-bundle.js.map
swagger-ui-standalone-preset.js.map
favicon-32x32.png
@Configuration
public class OpenApiConfig {
@Bean
public SwaggerIndexTransformer swaggerIndexTransformer(
SwaggerUiConfigProperties a,
SwaggerUiOAuthProperties b,
SwaggerUiConfigParameters c,
SwaggerWelcomeCommon d) {
return new SwaggerCodeBlockTransformer(a, b, c, d);
}
}
Illustrative example
The native support available added in spring-boot 3. If you have some time, do not hesitate to test it before the next release.
For the OpenAPI REST endpoints, you just need to build your application with the spring native profile.
If you give @OpenAPIDefinition or @SecurityScheme to a class that has no implementation, that class will disappear when
you natively compile. To avoid this, give the class a @Configuration .
@Configuration
@OpenAPIDefinition(info = @Info(title = “My App”, description = “description”))
public class OpenAPIConfig {
}
13.78. 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:
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-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-autoconfigure</artifactId>
<version>3.3.3</version>
</dependency>
Scan for the springdoc-openapi '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.
@Configuration
@EnableWebMvc
public class WebConfig implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) {
WebApplicationContext context = getContext();
servletContext.addListener(new ContextLoaderListener(context));
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("RestServlet",
new DispatcherServlet(context));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/*");
}
For groups usage make sure your GroupedOpenApi Beans are scanned.
If additionally, you are using custom context path : /my-servlet-path . Make sure you declare the following property:
spring.mvc.servlet.path=/my-servlet-path
In general, you should only pick the last stable version as per today 2.6.0.
More precisely, this the exhaustive list of spring-boot versions against which springdoc-openapi has been built:
spring-boot Versions
3.4.x
2.7.x +
3.0.x
2.0.x +
2.7.x , 1.5.x
1.6.0 +
2.6.x , 1.5.x
1.6.0 +
2.5.x , 1.5.x
1.5.9 +
2.4.x , 1.5.x
1.5.0 +
2.3.x , 1.5.x
1.4.0 +
2.2.x , 1.5.x
1.2.1 +
2.0.x , 1.5.x
1.0.0 +
13.80. Why am i getting an error: Swagger UI unable to render definition , when overriding the
default spring registered HttpMessageConverter ?
When overriding the default spring-boot registered HttpMessageConverter , you should have
ByteArrayHttpMessageConverter registered as well to have proper springdoc-openapi support.
converters.add(new ByteArrayHttpMessageConverter());
converters.add(new MappingJackson2HttpMessageConverter(jacksonBuilder.build()));
13.81. Some parameters are not generated in the resulting OpenAPI spec.
The issue is caused by the changes introduced by Spring-Boot 3.2.0 in particular for the Parameter Name Discovery. This can
be fixed by adding the -parameters arg to the Maven Compiler Plugin.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<parameters>true</parameters>
</configuration>
</plugin>