Repository: springdoc/springdoc-openapi
Pull request #2340 (2023-08-09 22:15:36)

feat: support OIDC
#2339.



Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c8c5d0d8b..72473564c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,36 +5,6 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
-## [2.2.0] - 2023-08-06
-
-### Added
-
-- #2189 - Add support for swagger-ui.url property 
-- #2200 - Support schema.requiredMode() on ParameterObject
-- #2309 - Added function to preload by specifying locale 
-- #2332 - Group name cannot be null or empty
-- #2281 - Initial Virtual thread support
-
-### Changed
-
-- Upgrade spring-boot to 3.1.2
-- Upgrade swagger-core to 2.2.15
-- Upgrade swagger-ui to 5.2.0
-
-### Fixed
-
-- #2199 - Fix Schema get condition of ArraySchema. 
-- #2194 - Fix Swagger UI with provided spec 
-- #2213 - Using both generated and configured specs stoped working in 1.6.5 
-- #2222 - String Index Out of Bounce Exception Fix when deployed on Azure
-- #2243, #2235 - Fix StringIndexOutOfBoundsException when path is same webjar 
-- #2291 - Fix default-flat-param-object doesn't work when using http body 
-- #2310 - Change bean name of objectMapperProvider 
-- #2207 - swagger-initializer.js is sent endcoded in the JVM's default charset
--  #2271, #2280 - Fix loop when response inherits generic class fixes
-- #2312 - Spec for @ParameterObject disappears if building native-images
-- #2326 - @QuerydslPredicate(root = X.class) annotation at Controller Method level not getting documented in Spring Boot 3
-
 ## [2.1.0] - 2023-04-01
 
 ### Added
diff --git a/pom.xml b/pom.xml
index 7358e365c..a640e12c0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>org.springdoc</groupId>
 	<artifactId>springdoc-openapi</artifactId>
-	<version>2.2.1-SNAPSHOT</version>
+	<version>2.1.1-SNAPSHOT</version>
 	<packaging>pom</packaging>
 	<name>Spring openapi documentation</name>
 	<description>Spring openapi documentation</description>
diff --git a/springdoc-openapi-starter-common/pom.xml b/springdoc-openapi-starter-common/pom.xml
index cd4e32097..574fd4067 100644
--- a/springdoc-openapi-starter-common/pom.xml
+++ b/springdoc-openapi-starter-common/pom.xml
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.springdoc</groupId>
 		<artifactId>springdoc-openapi</artifactId>
-		<version>2.2.1-SNAPSHOT</version>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 	<artifactId>springdoc-openapi-starter-common</artifactId>
 	<dependencies>
diff --git a/springdoc-openapi-starter-common/src/main/java/org/springdoc/api/AbstractOpenApiResource.java b/springdoc-openapi-starter-common/src/main/java/org/springdoc/api/AbstractOpenApiResource.java
index 0a9e67a8d..9dda5d890 100644
--- a/springdoc-openapi-starter-common/src/main/java/org/springdoc/api/AbstractOpenApiResource.java
+++ b/springdoc-openapi-starter-common/src/main/java/org/springdoc/api/AbstractOpenApiResource.java
@@ -47,8 +47,6 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.concurrent.Executors;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Collectors;
 
 import com.fasterxml.jackson.annotation.JsonView;
@@ -202,10 +200,6 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
 	 */
 	protected final SpringDocCustomizers springDocCustomizers;
 
-	/**
-	 * The Reentrant lock.
-	 */
-	private final Lock reentrantLock = new ReentrantLock();
 
 	/**
 	 * Instantiates a new Abstract open api resource.
@@ -325,78 +319,73 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
 	 * @param locale the locale
 	 * @return the open api
 	 */
-	protected OpenAPI getOpenApi(Locale locale) {
-		this.reentrantLock.lock();
-		try {
-			final OpenAPI openAPI;
-			final Locale finalLocale = locale == null ? Locale.getDefault() : locale;
-			if (openAPIService.getCachedOpenAPI(finalLocale) == null || springDocConfigProperties.isCacheDisabled()) {
-				Instant start = Instant.now();
-				openAPI = openAPIService.build(finalLocale);
-				Map<String, Object> mappingsMap = openAPIService.getMappingsMap().entrySet().stream()
-						.filter(controller -> (AnnotationUtils.findAnnotation(controller.getValue().getClass(),
-								Hidden.class) == null))
-						.filter(controller -> !isHiddenRestControllers(controller.getValue().getClass()))
-						.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a1, a2) -> a1));
-
-				Map<String, Object> findControllerAdvice = openAPIService.getControllerAdviceMap();
-				if (OpenApiVersion.OPENAPI_3_1 == springDocConfigProperties.getApiDocs().getVersion())
-					openAPI.openapi(OpenApiVersion.OPENAPI_3_1.getVersion());
-				if (springDocConfigProperties.isDefaultOverrideWithGenericResponse()) {
-					if (!CollectionUtils.isEmpty(mappingsMap))
-						findControllerAdvice.putAll(mappingsMap);
-					responseBuilder.buildGenericResponse(openAPI.getComponents(), findControllerAdvice, finalLocale);
-				}
-				getPaths(mappingsMap, finalLocale, openAPI);
-
-				Optional<CloudFunctionProvider> cloudFunctionProviderOptional = springDocProviders.getSpringCloudFunctionProvider();
-				cloudFunctionProviderOptional.ifPresent(cloudFunctionProvider -> {
-							List<RouterOperation> routerOperationList = cloudFunctionProvider.getRouterOperations(openAPI);
-							if (!CollectionUtils.isEmpty(routerOperationList))
-								this.calculatePath(routerOperationList, locale, openAPI);
-						}
-				);
-				if (!CollectionUtils.isEmpty(openAPI.getServers()))
-					openAPIService.setServersPresent(true);
-				else
-					openAPIService.setServersPresent(false);
-				openAPIService.updateServers(openAPI);
-
-				if (springDocConfigProperties.isRemoveBrokenReferenceDefinitions())
-					this.removeBrokenReferenceDefinitions(openAPI);
-
-				// run the optional customisers
-				List<Server> servers = openAPI.getServers();
-				List<Server> serversCopy = null;
-				try {
-					serversCopy = springDocProviders.jsonMapper()
-							.readValue(springDocProviders.jsonMapper().writeValueAsString(servers), new TypeReference<List<Server>>() {});
-				}
-				catch (JsonProcessingException e) {
-					LOGGER.warn("Json Processing Exception occurred: {}", e.getMessage());
-				}
-
-				openAPIService.getContext().getBeansOfType(OpenApiLocaleCustomizer.class).values().forEach(openApiLocaleCustomizer -> openApiLocaleCustomizer.customise(openAPI, finalLocale));
-				springDocCustomizers.getOpenApiCustomizers().ifPresent(apiCustomizers -> apiCustomizers.forEach(openApiCustomizer -> openApiCustomizer.customise(openAPI)));
-				if (!CollectionUtils.isEmpty(openAPI.getServers()) && !openAPI.getServers().equals(serversCopy))
-					openAPIService.setServersPresent(true);
+	protected synchronized OpenAPI getOpenApi(Locale locale) {
+		final OpenAPI openAPI;
+		final Locale finalLocale = locale == null ? Locale.getDefault() : locale;
+		if (openAPIService.getCachedOpenAPI(finalLocale) == null || springDocConfigProperties.isCacheDisabled()) {
+			Instant start = Instant.now();
+			openAPI = openAPIService.build(finalLocale);
+			Map<String, Object> mappingsMap = openAPIService.getMappingsMap().entrySet().stream()
+					.filter(controller -> (AnnotationUtils.findAnnotation(controller.getValue().getClass(),
+							Hidden.class) == null))
+					.filter(controller -> !isHiddenRestControllers(controller.getValue().getClass()))
+					.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (a1, a2) -> a1));
+
+			Map<String, Object> findControllerAdvice = openAPIService.getControllerAdviceMap();
+			if (OpenApiVersion.OPENAPI_3_1 == springDocConfigProperties.getApiDocs().getVersion())
+				openAPI.openapi(OpenApiVersion.OPENAPI_3_1.getVersion());
+			if (springDocConfigProperties.isDefaultOverrideWithGenericResponse()) {
+				if (!CollectionUtils.isEmpty(mappingsMap))
+					findControllerAdvice.putAll(mappingsMap);
+				responseBuilder.buildGenericResponse(openAPI.getComponents(), findControllerAdvice, finalLocale);
+			}
+			getPaths(mappingsMap, finalLocale, openAPI);
 
+			Optional<CloudFunctionProvider> cloudFunctionProviderOptional = springDocProviders.getSpringCloudFunctionProvider();
+			cloudFunctionProviderOptional.ifPresent(cloudFunctionProvider -> {
+						List<RouterOperation> routerOperationList = cloudFunctionProvider.getRouterOperations(openAPI);
+						if (!CollectionUtils.isEmpty(routerOperationList))
+							this.calculatePath(routerOperationList, locale, openAPI);
+					}
+			);
+			if (!CollectionUtils.isEmpty(openAPI.getServers()))
+				openAPIService.setServersPresent(true);
+			else
+				openAPIService.setServersPresent(false);
+			openAPIService.updateServers(openAPI);
 
-				openAPIService.setCachedOpenAPI(openAPI, finalLocale);
+			if (springDocConfigProperties.isRemoveBrokenReferenceDefinitions())
+				this.removeBrokenReferenceDefinitions(openAPI);
 
-				LOGGER.info("Init duration for springdoc-openapi is: {} ms",
-						Duration.between(start, Instant.now()).toMillis());
+			// run the optional customisers
+			List<Server> servers = openAPI.getServers();
+			List<Server> serversCopy = null;
+			try {
+				serversCopy = springDocProviders.jsonMapper()
+						.readValue(springDocProviders.jsonMapper().writeValueAsString(servers), new TypeReference<List<Server>>() {});
 			}
-			else {
-				LOGGER.debug("Fetching openApi document from cache");
-				openAPI = openAPIService.getCachedOpenAPI(finalLocale);
-				openAPIService.updateServers(openAPI);
+			catch (JsonProcessingException e) {
+				LOGGER.warn("Json Processing Exception occurred: {}", e.getMessage());
 			}
+
+			openAPIService.getContext().getBeansOfType(OpenApiLocaleCustomizer.class).values().forEach(openApiLocaleCustomizer -> openApiLocaleCustomizer.customise(openAPI, finalLocale));
+			springDocCustomizers.getOpenApiCustomizers().ifPresent(apiCustomizers -> apiCustomizers.forEach(openApiCustomizer -> openApiCustomizer.customise(openAPI)));
+			if (!CollectionUtils.isEmpty(openAPI.getServers()) && !openAPI.getServers().equals(serversCopy))
+				openAPIService.setServersPresent(true);
+
+
+			openAPIService.setCachedOpenAPI(openAPI, finalLocale);
+
+			LOGGER.info("Init duration for springdoc-openapi is: {} ms",
+					Duration.between(start, Instant.now()).toMillis());
+		}
+		else {
+			LOGGER.debug("Fetching openApi document from cache");
+			openAPI = openAPIService.getCachedOpenAPI(finalLocale);
 			openAPIService.updateServers(openAPI);
-			return openAPI;		}
-		finally {
-			this.reentrantLock.unlock();
 		}
+		openAPIService.updateServers(openAPI);
+		return openAPI;
 	}
 
 	/**
diff --git a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocConfiguration.java b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocConfiguration.java
index 4cf44cf6e..9824bb60f 100644
--- a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocConfiguration.java
+++ b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocConfiguration.java
@@ -33,7 +33,6 @@ import java.util.Map;
 import java.util.Optional;
 
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.querydsl.core.types.Predicate;
 import io.swagger.v3.core.converter.ModelConverter;
 import io.swagger.v3.oas.annotations.Hidden;
 import io.swagger.v3.oas.models.Components;
@@ -64,7 +63,6 @@ import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
 import org.springdoc.core.customizers.OpenApiCustomizer;
 import org.springdoc.core.customizers.OperationCustomizer;
 import org.springdoc.core.customizers.PropertyCustomizer;
-import org.springdoc.core.customizers.QuerydslPredicateOperationCustomizer;
 import org.springdoc.core.customizers.RouterOperationCustomizer;
 import org.springdoc.core.customizers.ServerBaseUrlCustomizer;
 import org.springdoc.core.customizers.SpringDocCustomizers;
@@ -112,7 +110,6 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Conditional;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Lazy;
-import org.springframework.data.querydsl.binding.QuerydslBindingsFactory;
 import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -620,29 +617,4 @@ public class SpringDocConfiguration {
 				 dataRestRouterOperationCustomizers,
 				 methodFilters, globalOpenApiCustomizers, globalOperationCustomizers, globalOpenApiMethodFilters);
 	}
-
-	/**
-	 * The type Querydsl provider.
-	 * @author bnasslashen
-	 */
-	@ConditionalOnClass(value = QuerydslBindingsFactory.class)
-	static class QuerydslProvider {
-
-		/**
-		 * Query dsl querydsl predicate operation customizer querydsl predicate operation customizer.
-		 *
-		 * @param querydslBindingsFactory the querydsl bindings factory
-		 * @return the querydsl predicate operation customizer
-		 */
-		@Bean
-		@ConditionalOnMissingBean
-		@Lazy(false)
-		QuerydslPredicateOperationCustomizer queryDslQuerydslPredicateOperationCustomizer(Optional<QuerydslBindingsFactory> querydslBindingsFactory) {
-			if (querydslBindingsFactory.isPresent()) {
-				getConfig().addRequestWrapperToIgnore(Predicate.class);
-				return new QuerydslPredicateOperationCustomizer(querydslBindingsFactory.get());
-			}
-			return null;
-		}
-	}
 }
diff --git a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocDataRestConfiguration.java b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocDataRestConfiguration.java
index f36393e54..d2cd2282c 100644
--- a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocDataRestConfiguration.java
+++ b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocDataRestConfiguration.java
@@ -27,8 +27,10 @@ package org.springdoc.core.configuration;
 import java.util.Optional;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.querydsl.core.types.Predicate;
 import org.springdoc.core.configuration.hints.SpringDocDataRestHints;
 import org.springdoc.core.converters.models.DefaultPageable;
+import org.springdoc.core.customizers.QuerydslPredicateOperationCustomizer;
 import org.springdoc.core.data.DataRestOperationService;
 import org.springdoc.core.data.DataRestRequestService;
 import org.springdoc.core.data.DataRestResponseService;
@@ -61,6 +63,7 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.context.annotation.Primary;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.mapping.context.PersistentEntities;
+import org.springframework.data.querydsl.binding.QuerydslBindingsFactory;
 import org.springframework.data.repository.support.Repositories;
 import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
 import org.springframework.data.rest.core.mapping.ResourceMappings;
@@ -237,4 +240,29 @@ public class SpringDocDataRestConfiguration {
 		}
 	}
 
+	/**
+	 * The type Querydsl provider.
+	 * @author bnasslashen
+	 */
+	@ConditionalOnClass(value = { QuerydslBindingsFactory.class })
+	class QuerydslProvider {
+
+		/**
+		 * Query dsl querydsl predicate operation customizer querydsl predicate operation customizer.
+		 *
+		 * @param querydslBindingsFactory the querydsl bindings factory
+		 * @return the querydsl predicate operation customizer
+		 */
+		@Bean
+		@ConditionalOnMissingBean
+		@Lazy(false)
+		QuerydslPredicateOperationCustomizer queryDslQuerydslPredicateOperationCustomizer(Optional<QuerydslBindingsFactory> querydslBindingsFactory) {
+			if (querydslBindingsFactory.isPresent()) {
+				getConfig().addRequestWrapperToIgnore(Predicate.class);
+				return new QuerydslPredicateOperationCustomizer(querydslBindingsFactory.get());
+			}
+			return null;
+		}
+	}
+
 }
diff --git a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocSecurityConfiguration.java b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocSecurityConfiguration.java
index 465a9bc4a..bbfdde039 100644
--- a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocSecurityConfiguration.java
+++ b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocSecurityConfiguration.java
@@ -41,7 +41,6 @@ import io.swagger.v3.oas.models.responses.ApiResponses;
 import org.apache.commons.lang3.reflect.FieldUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springdoc.core.configuration.hints.SpringDocSecurityHints;
 import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
 import org.springdoc.core.customizers.OpenApiCustomizer;
 
@@ -53,7 +52,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplicat
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.ImportRuntimeHints;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.core.Authentication;
@@ -81,7 +79,6 @@ import static org.springdoc.core.utils.SpringDocUtils.getConfig;
 @ConditionalOnClass(SecurityFilterChain.class)
 @ConditionalOnWebApplication
 @ConditionalOnBean(SpringDocConfiguration.class)
-@ImportRuntimeHints(SpringDocSecurityHints.class)
 public class SpringDocSecurityConfiguration {
 
 	private static final Logger LOGGER = LoggerFactory.getLogger(SpringDocSecurityConfiguration.class);
diff --git a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocSecurityOAuth2Customizer.java b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocSecurityOAuth2Customizer.java
index 9416b4472..0b828cb67 100644
--- a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocSecurityOAuth2Customizer.java
+++ b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocSecurityOAuth2Customizer.java
@@ -26,6 +26,9 @@ import org.slf4j.LoggerFactory;
 import org.springdoc.core.configuration.oauth2.SpringDocOAuth2AuthorizationServerMetadata;
 import org.springdoc.core.configuration.oauth2.SpringDocOAuth2Token;
 import org.springdoc.core.configuration.oauth2.SpringDocOAuth2TokenIntrospection;
+import org.springdoc.core.configuration.oauth2.SpringDocOidcClientRegistrationRequest;
+import org.springdoc.core.configuration.oauth2.SpringDocOidcClientRegistrationResponse;
+import org.springdoc.core.configuration.oauth2.SpringDocOidcProviderConfiguration;
 import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
 
 import org.springframework.beans.BeansException;
@@ -36,6 +39,9 @@ import org.springframework.http.HttpStatus;
 import org.springframework.security.oauth2.core.AuthorizationGrantType;
 import org.springframework.security.oauth2.core.OAuth2Error;
 import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames;
+import org.springframework.security.oauth2.server.authorization.oidc.web.OidcClientRegistrationEndpointFilter;
+import org.springframework.security.oauth2.server.authorization.oidc.web.OidcProviderConfigurationEndpointFilter;
+import org.springframework.security.oauth2.server.authorization.oidc.web.OidcUserInfoEndpointFilter;
 import org.springframework.security.oauth2.server.authorization.web.NimbusJwkSetEndpointFilter;
 import org.springframework.security.oauth2.server.authorization.web.OAuth2AuthorizationEndpointFilter;
 import org.springframework.security.oauth2.server.authorization.web.OAuth2AuthorizationServerMetadataEndpointFilter;
@@ -84,6 +90,9 @@ public class SpringDocSecurityOAuth2Customizer implements GlobalOpenApiCustomize
 			getOAuth2AuthorizationEndpoint(openAPI, filterChain);
 			getOAuth2TokenIntrospectionEndpointFilter(openAPI, filterChain);
 			getOAuth2TokenRevocationEndpointFilter(openAPI, filterChain);
+			getOidcProviderConfigurationEndpoint(openAPI, filterChain);
+			getOidcUserInfoEndpoint(openAPI, filterChain);
+			getOidcClientRegistrationEndpoint(openAPI, filterChain);
 		}
 	}
 
@@ -258,6 +267,76 @@ public class SpringDocSecurityOAuth2Customizer implements GlobalOpenApiCustomize
 		}
 	}
 
+	/**
+	 * Gets OpenID Provider endpoint filter
+	 *
+	 * @param openAPI the open api
+	 * @param securityFilterChain the security filter chain
+	 */
+	private void getOidcProviderConfigurationEndpoint(OpenAPI openAPI, SecurityFilterChain securityFilterChain) {
+		Object oAuth2EndpointFilter =
+				new SpringDocSecurityOAuth2EndpointUtils(OidcProviderConfigurationEndpointFilter.class).findEndpoint(securityFilterChain);
+
+		if (oAuth2EndpointFilter != null) {
+			ApiResponses apiResponses = new ApiResponses();
+			buildApiResponsesOnSuccess(apiResponses, AnnotationsUtils.resolveSchemaFromType(SpringDocOidcProviderConfiguration.class, openAPI.getComponents(), null));
+			buildApiResponsesOnInternalServerError(apiResponses);
+			Operation operation = buildOperation(apiResponses);
+			buildPath(oAuth2EndpointFilter, "requestMatcher", openAPI, operation, HttpMethod.GET);
+		}
+	}
+
+	/**
+	 * Gets OpenID UserInfo endpoint filter
+	 *
+	 * @param openAPI the open api
+	 * @param securityFilterChain the security filter chain
+	 */
+	private void getOidcUserInfoEndpoint(OpenAPI openAPI, SecurityFilterChain securityFilterChain) {
+		Object oAuth2EndpointFilter =
+				new SpringDocSecurityOAuth2EndpointUtils(OidcUserInfoEndpointFilter.class).findEndpoint(securityFilterChain);
+
+		if (oAuth2EndpointFilter != null) {
+			ApiResponses apiResponses = new ApiResponses();
+			Schema<?> schema = new ObjectSchema().additionalProperties(new StringSchema());
+			buildApiResponsesOnSuccess(apiResponses, schema);
+			buildApiResponsesOnInternalServerError(apiResponses);
+			Operation operation = buildOperation(apiResponses);
+			buildPath(oAuth2EndpointFilter, "userInfoEndpointMatcher", openAPI, operation, HttpMethod.GET);
+		}
+	}
+
+	/**
+	 * Gets OpenID Client Registration endpoint filter
+	 *
+	 * @param openAPI the open api
+	 * @param securityFilterChain the security filter chain
+	 */
+	private void getOidcClientRegistrationEndpoint(OpenAPI openAPI, SecurityFilterChain securityFilterChain) {
+		Object oAuth2EndpointFilter =
+				new SpringDocSecurityOAuth2EndpointUtils(OidcClientRegistrationEndpointFilter.class).findEndpoint(securityFilterChain);
+
+		if (oAuth2EndpointFilter != null) {
+			ApiResponses apiResponses = new ApiResponses();
+			buildApiResponsesOnCreated(apiResponses, AnnotationsUtils.resolveSchemaFromType(SpringDocOidcClientRegistrationResponse.class, openAPI.getComponents(), null));
+			buildApiResponsesOnInternalServerError(apiResponses);
+			buildApiResponsesOnBadRequest(apiResponses, openAPI);
+			buildOAuth2Error(openAPI, apiResponses, HttpStatus.UNAUTHORIZED);
+			buildOAuth2Error(openAPI, apiResponses, HttpStatus.FORBIDDEN);
+			Operation operation = buildOperation(apiResponses);
+
+			// OidcClientRegistration
+			Schema schema = AnnotationsUtils.resolveSchemaFromType(SpringDocOidcClientRegistrationRequest.class, openAPI.getComponents(), null);
+
+			String mediaType = APPLICATION_JSON_VALUE;
+			RequestBody requestBody = new RequestBody().content(new Content().addMediaType(mediaType, new MediaType().schema(schema)));
+			operation.setRequestBody(requestBody);
+			operation.addParametersItem(new HeaderParameter().name("Authorization"));
+
+			buildPath(oAuth2EndpointFilter, "clientRegistrationEndpointMatcher", openAPI, operation, HttpMethod.POST);
+		}
+	}
+
 	/**
 	 * Build operation operation.
 	 *
@@ -286,6 +365,21 @@ public class SpringDocSecurityOAuth2Customizer implements GlobalOpenApiCustomize
 		return apiResponses;
 	}
 
+	/**
+	 * Build api responses api responses on created.
+	 *
+	 * @param apiResponses the api responses
+	 * @param schema the schema
+	 * @return the api responses
+	 */
+	private ApiResponses buildApiResponsesOnCreated(ApiResponses apiResponses, Schema schema) {
+		ApiResponse response = new ApiResponse().description(HttpStatus.CREATED.getReasonPhrase()).content(new Content().addMediaType(
+				APPLICATION_JSON_VALUE,
+				new MediaType().schema(schema)));
+		apiResponses.addApiResponse(String.valueOf(HttpStatus.CREATED.value()), response);
+		return apiResponses;
+	}
+
 	/**
 	 * Build api responses api responses on internal server error.
 	 *
@@ -337,22 +431,23 @@ public class SpringDocSecurityOAuth2Customizer implements GlobalOpenApiCustomize
 			Field tokenEndpointMatcherField = FieldUtils.getDeclaredField(oAuth2EndpointFilter.getClass(), authorizationEndpointMatcher, true);
 			RequestMatcher endpointMatcher = (RequestMatcher) tokenEndpointMatcherField.get(oAuth2EndpointFilter);
 			String path = null;
-			if (endpointMatcher instanceof AntPathRequestMatcher)
-				path = ((AntPathRequestMatcher) endpointMatcher).getPattern();
-			else if (endpointMatcher instanceof OrRequestMatcher) {
-				OrRequestMatcher endpointMatchers = (OrRequestMatcher) endpointMatcher;
+			if (endpointMatcher instanceof AntPathRequestMatcher antPathRequestMatcher)
+				path = antPathRequestMatcher.getPattern();
+			else if (endpointMatcher instanceof OrRequestMatcher endpointMatchers) {
 				Field requestMatchersField = FieldUtils.getDeclaredField(OrRequestMatcher.class, "requestMatchers", true);
 				Iterable<RequestMatcher> requestMatchers = (Iterable<RequestMatcher>) requestMatchersField.get(endpointMatchers);
 				for (RequestMatcher requestMatcher : requestMatchers) {
-					if (requestMatcher instanceof OrRequestMatcher) {
-						OrRequestMatcher orRequestMatcher = (OrRequestMatcher) requestMatcher;
+					if (requestMatcher instanceof OrRequestMatcher orRequestMatcher) {
 						requestMatchersField = FieldUtils.getDeclaredField(OrRequestMatcher.class, "requestMatchers", true);
 						requestMatchers = (Iterable<RequestMatcher>) requestMatchersField.get(orRequestMatcher);
 						for (RequestMatcher matcher : requestMatchers) {
-							if (matcher instanceof AntPathRequestMatcher)
-								path = ((AntPathRequestMatcher) matcher).getPattern();
+							if (matcher instanceof AntPathRequestMatcher antPathRequestMatcher)
+								path = antPathRequestMatcher.getPattern();
 						}
 					}
+					else if (requestMatcher instanceof AntPathRequestMatcher antPathRequestMatcher) {
+						path = antPathRequestMatcher.getPattern();
+					}
 				}
 			}
 
diff --git a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/hints/SpringDocHints.java b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/hints/SpringDocHints.java
index e4ac1f7b3..4fcce49ff 100644
--- a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/hints/SpringDocHints.java
+++ b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/hints/SpringDocHints.java
@@ -86,8 +86,8 @@ import org.springframework.aot.hint.RuntimeHintsRegistrar;
  */
 public class SpringDocHints implements RuntimeHintsRegistrar {
 
-	static Class[] typesToRegister = {
-			//swagger-models
+	//swagger-models
+	static Class[] swaggerModels = {
 			io.swagger.v3.oas.models.security.SecurityScheme.Type.class,
 			io.swagger.v3.oas.models.security.SecurityScheme.In.class,
 			io.swagger.v3.oas.models.media.Encoding.class,
@@ -159,12 +159,6 @@ public class SpringDocHints implements RuntimeHintsRegistrar {
 			DateSchemaMixin.class,
 			ExampleMixin.class,
 			MediaTypeMixin.class,
-			//springdoc classes
-			org.springdoc.core.annotations.ParameterObject.class,
-			org.springdoc.core.converters.models.Pageable.class,
-			org.springdoc.core.extractor.DelegatingMethodParameter.class,
-			// spring
-			org.springframework.core.MethodParameter.class
 	};
 
 	@Override
@@ -180,7 +174,7 @@ public class SpringDocHints implements RuntimeHintsRegistrar {
 				.registerType(java.lang.module.Configuration.class, MemberCategory.INVOKE_DECLARED_METHODS)
 				.registerType(java.lang.module.ResolvedModule.class, MemberCategory.INVOKE_DECLARED_METHODS);
 		//swagger-models
-		Arrays.stream(typesToRegister).forEach(aClass ->
+		Arrays.stream(swaggerModels).forEach(aClass ->
 				hints.reflection().registerType(aClass,
 						hint -> hint.withMembers(
 								MemberCategory.DECLARED_FIELDS,
diff --git a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/hints/SpringDocSecurityHints.java b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/hints/SpringDocSecurityHints.java
deleted file mode 100644
index 22930100e..000000000
--- a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/hints/SpringDocSecurityHints.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *
- *  *
- *  *  *
- *  *  *  *
- *  *  *  *  * Copyright 2019-2022 the original author or authors.
- *  *  *  *  *
- *  *  *  *  * Licensed under the Apache License, Version 2.0 (the "License");
- *  *  *  *  * you may not use this file except in compliance with the License.
- *  *  *  *  * You may obtain a copy of the License at
- *  *  *  *  *
- *  *  *  *  *      https://www.apache.org/licenses/LICENSE-2.0
- *  *  *  *  *
- *  *  *  *  * Unless required by applicable law or agreed to in writing, software
- *  *  *  *  * distributed under the License is distributed on an "AS IS" BASIS,
- *  *  *  *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  *  *  *  * See the License for the specific language governing permissions and
- *  *  *  *  * limitations under the License.
- *  *  *  *
- *  *  *
- *  *
- *
- */
-
-package org.springdoc.core.configuration.hints;
-
-import java.util.Arrays;
-
-import org.springframework.aot.hint.MemberCategory;
-import org.springframework.aot.hint.RuntimeHints;
-import org.springframework.aot.hint.RuntimeHintsRegistrar;
-
-/**
- * The type Spring doc DataRest hints.
- * @author bnasslahsen
- */
-public class SpringDocSecurityHints implements RuntimeHintsRegistrar {
-
-	//spring-security
-	static String[] springSecurityTypeNames = { "org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter",
-			"org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter",
-			"org.springframework.security.web.util.matcher.OrRequestMatcher"
-	};
-
-	@Override
-	public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
-		//spring-security
-		Arrays.stream(springSecurityTypeNames).forEach(springDataRestTypeName ->
-				hints.reflection()
-						.registerTypeIfPresent(classLoader, springDataRestTypeName,
-								hint -> hint.withMembers(MemberCategory.DECLARED_FIELDS,
-										MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
-										MemberCategory.INVOKE_DECLARED_METHODS
-								))
-		);
-	}
-
-}
-
diff --git a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/oauth2/SpringDocOidcClientRegistrationRequest.java b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/oauth2/SpringDocOidcClientRegistrationRequest.java
new file mode 100644
index 000000000..984d7539a
--- /dev/null
+++ b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/oauth2/SpringDocOidcClientRegistrationRequest.java
@@ -0,0 +1,58 @@
+package org.springdoc.core.configuration.oauth2;
+
+import java.time.Instant;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import org.springframework.security.oauth2.server.authorization.oidc.OidcClientMetadataClaimNames;
+
+/**
+ * The type Spring doc OpenID Client Registration Request
+ *
+ * @see <a href="https://github.com/spring-projects/spring-authorization-server/blob/main/oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/oidc/OidcClientRegistration.java">OidcClientRegistration</a>
+ * @see <a href="https://github.com/spring-projects/spring-authorization-server/blob/main/oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/oidc/http/converter/OidcClientRegistrationHttpMessageConverter.java">OidcClientRegistrationHttpMessageConverter</a>
+ * @author yuta.saito
+ */
+@Schema(name = "ClientRegistrationRequest")
+public interface SpringDocOidcClientRegistrationRequest {
+	@JsonProperty(OidcClientMetadataClaimNames.CLIENT_ID)
+	String clientId();
+
+	@JsonProperty(OidcClientMetadataClaimNames.CLIENT_ID_ISSUED_AT)
+	Instant clientIdIssuedAt();
+
+	@JsonProperty(OidcClientMetadataClaimNames.CLIENT_SECRET)
+	String clientSecret();
+
+	@JsonProperty(OidcClientMetadataClaimNames.CLIENT_SECRET_EXPIRES_AT)
+	Instant CLIENT_SECRET_EXPIRES_AT();
+
+	@JsonProperty(OidcClientMetadataClaimNames.CLIENT_NAME)
+	String clientName();
+
+	@JsonProperty(OidcClientMetadataClaimNames.REDIRECT_URIS)
+	List<String> redirectUris();
+
+	@JsonProperty(OidcClientMetadataClaimNames.TOKEN_ENDPOINT_AUTH_METHOD)
+	String tokenEndpointAuthenticationMethod();
+
+	@JsonProperty(OidcClientMetadataClaimNames.TOKEN_ENDPOINT_AUTH_SIGNING_ALG)
+	String tokenEndpointAuthenticationSigningAlgorithm();
+
+	@JsonProperty(OidcClientMetadataClaimNames.GRANT_TYPES)
+	List<String> grantTypes();
+
+	@JsonProperty(OidcClientMetadataClaimNames.RESPONSE_TYPES)
+	List<String> responseType();
+
+	@JsonProperty(OidcClientMetadataClaimNames.SCOPE)
+	String scopes();
+
+	@JsonProperty(OidcClientMetadataClaimNames.JWKS_URI)
+	String jwkSetUrl();
+
+	@JsonProperty(OidcClientMetadataClaimNames.ID_TOKEN_SIGNED_RESPONSE_ALG)
+	String idTokenSignedResponseAlgorithm();
+}
diff --git a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/oauth2/SpringDocOidcClientRegistrationResponse.java b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/oauth2/SpringDocOidcClientRegistrationResponse.java
new file mode 100644
index 000000000..f115b8673
--- /dev/null
+++ b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/oauth2/SpringDocOidcClientRegistrationResponse.java
@@ -0,0 +1,64 @@
+package org.springdoc.core.configuration.oauth2;
+
+import java.time.Instant;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import org.springframework.security.oauth2.server.authorization.oidc.OidcClientMetadataClaimNames;
+
+/**
+ * The type Spring doc OpenID Client Registration Request
+ *
+ * @see <a href="https://github.com/spring-projects/spring-authorization-server/blob/main/oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/oidc/OidcClientRegistration.java">OidcClientRegistration</a>
+ * @see <a href="https://github.com/spring-projects/spring-authorization-server/blob/main/oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/oidc/http/converter/OidcClientRegistrationHttpMessageConverter.java">OidcClientRegistrationHttpMessageConverter</a>
+ * @author yuta.saito
+ */
+@Schema(name = "ClientRegistrationResponse")
+public interface SpringDocOidcClientRegistrationResponse {
+	@JsonProperty(OidcClientMetadataClaimNames.CLIENT_ID)
+	String clientId();
+
+	@JsonProperty(OidcClientMetadataClaimNames.CLIENT_ID_ISSUED_AT)
+	long clientIdIssuedAt();
+
+	@JsonProperty(OidcClientMetadataClaimNames.CLIENT_SECRET)
+	String clientSecret();
+
+	@JsonProperty(OidcClientMetadataClaimNames.CLIENT_SECRET_EXPIRES_AT)
+	long CLIENT_SECRET_EXPIRES_AT();
+
+	@JsonProperty(OidcClientMetadataClaimNames.CLIENT_NAME)
+	String clientName();
+
+	@JsonProperty(OidcClientMetadataClaimNames.REDIRECT_URIS)
+	List<String> redirectUris();
+
+	@JsonProperty(OidcClientMetadataClaimNames.TOKEN_ENDPOINT_AUTH_METHOD)
+	String tokenEndpointAuthenticationMethod();
+
+	@JsonProperty(OidcClientMetadataClaimNames.TOKEN_ENDPOINT_AUTH_SIGNING_ALG)
+	String tokenEndpointAuthenticationSigningAlgorithm();
+
+	@JsonProperty(OidcClientMetadataClaimNames.GRANT_TYPES)
+	List<String> grantTypes();
+
+	@JsonProperty(OidcClientMetadataClaimNames.RESPONSE_TYPES)
+	List<String> responseType();
+
+	@JsonProperty(OidcClientMetadataClaimNames.SCOPE)
+	String scopes();
+
+	@JsonProperty(OidcClientMetadataClaimNames.JWKS_URI)
+	String jwkSetUrl();
+
+	@JsonProperty(OidcClientMetadataClaimNames.ID_TOKEN_SIGNED_RESPONSE_ALG)
+	String idTokenSignedResponseAlgorithm();
+
+	@JsonProperty(OidcClientMetadataClaimNames.REGISTRATION_ACCESS_TOKEN)
+	String registrationAccessToken();
+
+	@JsonProperty(OidcClientMetadataClaimNames.REGISTRATION_CLIENT_URI)
+	String registrationClientUrl();
+}
diff --git a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/oauth2/SpringDocOidcProviderConfiguration.java b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/oauth2/SpringDocOidcProviderConfiguration.java
new file mode 100644
index 000000000..15f7f99c4
--- /dev/null
+++ b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/oauth2/SpringDocOidcProviderConfiguration.java
@@ -0,0 +1,66 @@
+package org.springdoc.core.configuration.oauth2;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationServerMetadataClaimNames;
+import org.springframework.security.oauth2.server.authorization.oidc.OidcProviderMetadataClaimNames;
+
+/**
+ * The type Spring doc OpenID Provider Configuration
+ *
+ * @see <a href="https://github.com/spring-projects/spring-authorization-server/blob/main/oauth2-authorization-server/src/main/java/org/springframework/security/oauth2/server/authorization/oidc/OidcProviderConfiguration.java">OidcProviderConfiguration</a>
+ * @author yuta.saito
+ */
+@Schema(name = "OidcProviderConfiguration")
+public interface SpringDocOidcProviderConfiguration {
+	@JsonProperty(OAuth2AuthorizationServerMetadataClaimNames.ISSUER)
+	String issuer();
+
+	@JsonProperty(OAuth2AuthorizationServerMetadataClaimNames.AUTHORIZATION_ENDPOINT)
+	String authorizationEndpoint();
+
+	@JsonProperty(OAuth2AuthorizationServerMetadataClaimNames.TOKEN_ENDPOINT)
+	String tokenEndpoint();
+
+	@JsonProperty(OAuth2AuthorizationServerMetadataClaimNames.TOKEN_ENDPOINT_AUTH_METHODS_SUPPORTED)
+	List<String> tokenEndpointAuthMethodsSupported();
+
+	@JsonProperty(OAuth2AuthorizationServerMetadataClaimNames.JWKS_URI)
+	String jwksUri();
+
+	@JsonProperty(OidcProviderMetadataClaimNames.USER_INFO_ENDPOINT)
+	String userInfoEndpoint();
+
+	@JsonProperty(OAuth2AuthorizationServerMetadataClaimNames.RESPONSE_TYPES_SUPPORTED)
+	List<String> responseTypesSupported();
+
+	@JsonProperty(OAuth2AuthorizationServerMetadataClaimNames.GRANT_TYPES_SUPPORTED)
+	List<String> grantTypesSupported();
+
+	@JsonProperty(OAuth2AuthorizationServerMetadataClaimNames.REVOCATION_ENDPOINT)
+	String revocationEndpoint();
+
+	@JsonProperty(OAuth2AuthorizationServerMetadataClaimNames.REVOCATION_ENDPOINT_AUTH_METHODS_SUPPORTED)
+	List<String> revocationEndpointAuthMethodsSupported();
+
+	@JsonProperty(OAuth2AuthorizationServerMetadataClaimNames.INTROSPECTION_ENDPOINT)
+	String introspectionEndpoint();
+
+	@JsonProperty(OAuth2AuthorizationServerMetadataClaimNames.INTROSPECTION_ENDPOINT_AUTH_METHODS_SUPPORTED)
+	List<String> introspectionEndpointAuthMethodsSupported();
+
+	@JsonProperty(OidcProviderMetadataClaimNames.SUBJECT_TYPES_SUPPORTED)
+	String subjectTypesSupported();
+
+	@JsonProperty(OidcProviderMetadataClaimNames.ID_TOKEN_SIGNING_ALG_VALUES_SUPPORTED)
+	String idTokenSigningAlgValuesSupported();
+
+	@JsonProperty(OAuth2AuthorizationServerMetadataClaimNames.SCOPES_SUPPORTED)
+	String scopeSupported();
+
+	@JsonProperty(OAuth2AuthorizationServerMetadataClaimNames.CODE_CHALLENGE_METHODS_SUPPORTED)
+	List<String> codeChallengeMethodsSupported();
+}
diff --git a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/service/GenericResponseService.java b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/service/GenericResponseService.java
index ca4ff5ba2..276dcb4fa 100644
--- a/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/service/GenericResponseService.java
+++ b/springdoc-openapi-starter-common/src/main/java/org/springdoc/core/service/GenericResponseService.java
@@ -40,9 +40,6 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -91,7 +88,6 @@ import static org.springdoc.core.utils.SpringDocAnnotationsUtils.mergeSchema;
 
 /**
  * The type Generic response builder.
- *
  * @author bnasslahsen
  */
 public class GenericResponseService {
@@ -130,30 +126,24 @@ public class GenericResponseService {
 	/**
 	 * The Controller advice infos.
 	 */
-	private final List<ControllerAdviceInfo> controllerAdviceInfos = new CopyOnWriteArrayList<>();
+	private final List<ControllerAdviceInfo> controllerAdviceInfos = new ArrayList<>();
 
 	/**
 	 * The Controller infos.
 	 */
-	private final List<ControllerAdviceInfo> localExceptionHandlers = new CopyOnWriteArrayList<>();
-
-	/**
-	 * The Reentrant lock.
-	 */
-	private final Lock reentrantLock = new ReentrantLock();
+	private final List<ControllerAdviceInfo> localExceptionHandlers = new ArrayList<>();
 
 	/**
 	 * The constant LOGGER.
 	 */
 	private static final Logger LOGGER = LoggerFactory.getLogger(GenericResponseService.class);
-
 	/**
 	 * Instantiates a new Generic response builder.
 	 *
-	 * @param operationService          the operation builder
-	 * @param returnTypeParsers         the return type parsers
+	 * @param operationService the operation builder
+	 * @param returnTypeParsers the return type parsers
 	 * @param springDocConfigProperties the spring doc config properties
-	 * @param propertyResolverUtils     the property resolver utils
+	 * @param propertyResolverUtils the property resolver utils
 	 */
 	public GenericResponseService(OperationService operationService, List<ReturnTypeParser> returnTypeParsers,
 			SpringDocConfigProperties springDocConfigProperties,
@@ -168,11 +158,11 @@ public class GenericResponseService {
 	/**
 	 * Build content from doc.
 	 *
-	 * @param components             the components
-	 * @param apiResponsesOp         the api responses op
-	 * @param methodAttributes       the method attributes
+	 * @param components the components
+	 * @param apiResponsesOp the api responses op
+	 * @param methodAttributes the method attributes
 	 * @param apiResponseAnnotations the api response annotations
-	 * @param apiResponse            the api response
+	 * @param apiResponse the api response
 	 */
 	public static void buildContentFromDoc(Components components, ApiResponses apiResponsesOp,
 			MethodAttributes methodAttributes,
@@ -209,7 +199,7 @@ public class GenericResponseService {
 	/**
 	 * Sets description.
 	 *
-	 * @param httpCode    the http code
+	 * @param httpCode the http code
 	 * @param apiResponse the api response
 	 */
 	public static void setDescription(String httpCode, ApiResponse apiResponse) {
@@ -234,9 +224,9 @@ public class GenericResponseService {
 	/**
 	 * Build api responses.
 	 *
-	 * @param components       the components
-	 * @param handlerMethod    the handler method
-	 * @param operation        the operation
+	 * @param components the components
+	 * @param handlerMethod the handler method
+	 * @param operation the operation
 	 * @param methodAttributes the method attributes
 	 * @return the api responses
 	 */
@@ -262,7 +252,7 @@ public class GenericResponseService {
 	 * Filters the generic API responses by the declared exceptions.
 	 * If Javadoc comment found for the declaration than it overrides the default description.
 	 *
-	 * @param handlerMethod      the method which can have exception declarations
+	 * @param handlerMethod the method which can have exception declarations
 	 * @param genericMapResponse the default generic API responses
 	 * @return the filtered and enriched responses
 	 */
@@ -291,9 +281,9 @@ public class GenericResponseService {
 	/**
 	 * Build generic response.
 	 *
-	 * @param components           the components
+	 * @param components the components
 	 * @param findControllerAdvice the find controller advice
-	 * @param locale               the locale
+	 * @param locale the locale
 	 */
 	public void buildGenericResponse(Components components, Map<String, Object> findControllerAdvice, Locale locale) {
 		// ControllerAdvice
@@ -333,11 +323,13 @@ public class GenericResponseService {
 					apiResponses.forEach(controllerAdviceInfoApiResponseMap::put);
 				}
 			}
-			if (AnnotatedElementUtils.hasAnnotation(objClz, ControllerAdvice.class)) {
-				controllerAdviceInfos.add(controllerAdviceInfo);
-			}
-			else {
-				localExceptionHandlers.add(controllerAdviceInfo);
+			synchronized (this) {
+				if (AnnotatedElementUtils.hasAnnotation(objClz, ControllerAdvice.class)) {
+					controllerAdviceInfos.add(controllerAdviceInfo);
+				}
+				else {
+					localExceptionHandlers.add(controllerAdviceInfo);
+				}
 			}
 		}
 	}
@@ -357,9 +349,9 @@ public class GenericResponseService {
 	/**
 	 * Compute response from doc map.
 	 *
-	 * @param components       the components
-	 * @param methodParameter  the method parameter
-	 * @param apiResponsesOp   the api responses op
+	 * @param components the components
+	 * @param methodParameter the method parameter
+	 * @param apiResponsesOp the api responses op
 	 * @param methodAttributes the method attributes
 	 * @return the map
 	 */
@@ -393,9 +385,9 @@ public class GenericResponseService {
 	/**
 	 * Build generic api responses.
 	 *
-	 * @param components       the components
-	 * @param methodParameter  the method parameter
-	 * @param apiResponsesOp   the api responses op
+	 * @param components the components
+	 * @param methodParameter the method parameter
+	 * @param apiResponsesOp the api responses op
 	 * @param methodAttributes the method attributes
 	 */
 	private void buildGenericApiResponses(Components components, MethodParameter methodParameter, ApiResponses apiResponsesOp,
@@ -423,9 +415,9 @@ public class GenericResponseService {
 	/**
 	 * Build api responses.
 	 *
-	 * @param components       the components
-	 * @param methodParameter  the method parameter
-	 * @param apiResponsesOp   the api responses op
+	 * @param components the components
+	 * @param methodParameter the method parameter
+	 * @param apiResponsesOp the api responses op
 	 * @param methodAttributes the method attributes
 	 */
 	private void buildApiResponses(Components components, MethodParameter methodParameter, ApiResponses apiResponsesOp,
@@ -490,10 +482,10 @@ public class GenericResponseService {
 	/**
 	 * Build content content.
 	 *
-	 * @param components      the components
+	 * @param components the components
 	 * @param methodParameter the method parameter
-	 * @param methodProduces  the method produces
-	 * @param jsonView        the json view
+	 * @param methodProduces the method produces
+	 * @param jsonView the json view
 	 * @return the content
 	 */
 	private Content buildContent(Components components, MethodParameter methodParameter, String[] methodProduces, JsonView jsonView) {
@@ -504,11 +496,11 @@ public class GenericResponseService {
 	/**
 	 * Build content content.
 	 *
-	 * @param components     the components
-	 * @param annotations    the annotations
+	 * @param components the components
+	 * @param annotations the annotations
 	 * @param methodProduces the method produces
-	 * @param jsonView       the json view
-	 * @param returnType     the return type
+	 * @param jsonView the json view
+	 * @param returnType the return type
 	 * @return the content
 	 */
 	public Content buildContent(Components components, Annotation[] annotations, String[] methodProduces, JsonView jsonView, Type returnType) {
@@ -550,9 +542,9 @@ public class GenericResponseService {
 	/**
 	 * Calculate schema schema.
 	 *
-	 * @param components  the components
-	 * @param returnType  the return type
-	 * @param jsonView    the json view
+	 * @param components the components
+	 * @param returnType the return type
+	 * @param jsonView the json view
 	 * @param annotations the annotations
 	 * @return the schema
 	 */
@@ -566,8 +558,8 @@ public class GenericResponseService {
 	 * Sets content.
 	 *
 	 * @param methodProduces the method produces
-	 * @param content        the content
-	 * @param mediaType      the media type
+	 * @param content the content
+	 * @param mediaType the media type
 	 */
 	private void setContent(String[] methodProduces, Content content,
 			io.swagger.v3.oas.models.media.MediaType mediaType) {
@@ -577,13 +569,13 @@ public class GenericResponseService {
 	/**
 	 * Build api responses.
 	 *
-	 * @param components       the components
-	 * @param methodParameter  the method parameter
-	 * @param apiResponsesOp   the api responses op
+	 * @param components the components
+	 * @param methodParameter the method parameter
+	 * @param apiResponsesOp the api responses op
 	 * @param methodAttributes the method attributes
-	 * @param httpCode         the http code
-	 * @param apiResponse      the api response
-	 * @param isGeneric        the is generic
+	 * @param httpCode the http code
+	 * @param apiResponse the api response
+	 * @param isGeneric the is generic
 	 */
 	private void buildApiResponses(Components components, MethodParameter methodParameter, ApiResponses apiResponsesOp,
 			MethodAttributes methodAttributes, String httpCode, ApiResponse apiResponse, boolean isGeneric) {
@@ -638,8 +630,8 @@ public class GenericResponseService {
 	/**
 	 * Evaluate response status string.
 	 *
-	 * @param method    the method
-	 * @param beanType  the bean type
+	 * @param method the method
+	 * @param beanType the bean type
 	 * @param isGeneric the is generic
 	 * @return the string
 	 */
@@ -679,55 +671,49 @@ public class GenericResponseService {
 	 * @param beanType the bean type
 	 * @return the generic map response
 	 */
-	private Map<String, ApiResponse> getGenericMapResponse(Class<?> beanType) {
-		reentrantLock.lock();
-		try {
-			List<ControllerAdviceInfo> controllerAdviceInfosInThisBean = localExceptionHandlers.stream()
-					.filter(controllerInfo -> {
-						Class<?> objClz = controllerInfo.getControllerAdvice().getClass();
-						if (org.springframework.aop.support.AopUtils.isAopProxy(controllerInfo.getControllerAdvice()))
-							objClz = org.springframework.aop.support.AopUtils.getTargetClass(controllerInfo.getControllerAdvice());
-						return beanType.equals(objClz);
-					})
-					.collect(Collectors.toList());
-
-			Map<String, ApiResponse> genericApiResponseMap = controllerAdviceInfosInThisBean.stream()
-					.map(ControllerAdviceInfo::getApiResponseMap)
-					.collect(LinkedHashMap::new, Map::putAll, Map::putAll);
-
-			List<ControllerAdviceInfo> controllerAdviceInfosNotInThisBean = controllerAdviceInfos.stream()
-					.filter(controllerAdviceInfo ->
-							new ControllerAdviceBean(controllerAdviceInfo.getControllerAdvice()).isApplicableToBeanType(beanType))
-					.filter(controllerAdviceInfo -> !beanType.equals(controllerAdviceInfo.getControllerAdvice().getClass()))
-					.toList();
-
-			for (ControllerAdviceInfo controllerAdviceInfo : controllerAdviceInfosNotInThisBean) {
-				controllerAdviceInfo.getApiResponseMap().forEach((key, apiResponse) -> {
-					if (!genericApiResponseMap.containsKey(key))
-						genericApiResponseMap.put(key, apiResponse);
-				});
-			}
+	private synchronized Map<String, ApiResponse> getGenericMapResponse(Class<?> beanType) {
+		List<ControllerAdviceInfo> controllerAdviceInfosInThisBean = localExceptionHandlers.stream()
+				.filter(controllerInfo -> {
+					Class<?> objClz = controllerInfo.getControllerAdvice().getClass();
+					if (org.springframework.aop.support.AopUtils.isAopProxy(controllerInfo.getControllerAdvice()))
+						objClz = org.springframework.aop.support.AopUtils.getTargetClass(controllerInfo.getControllerAdvice());
+					return beanType.equals(objClz);
+				})
+				.collect(Collectors.toList());
+
+		Map<String, ApiResponse> genericApiResponseMap = controllerAdviceInfosInThisBean.stream()
+				.map(ControllerAdviceInfo::getApiResponseMap)
+				.collect(LinkedHashMap::new, Map::putAll, Map::putAll);
+
+		List<ControllerAdviceInfo> controllerAdviceInfosNotInThisBean = controllerAdviceInfos.stream()
+				.filter(controllerAdviceInfo ->
+						new ControllerAdviceBean(controllerAdviceInfo.getControllerAdvice()).isApplicableToBeanType(beanType))
+				.filter(controllerAdviceInfo -> !beanType.equals(controllerAdviceInfo.getControllerAdvice().getClass()))
+				.toList();
+
+		for (ControllerAdviceInfo controllerAdviceInfo : controllerAdviceInfosNotInThisBean) {
+			controllerAdviceInfo.getApiResponseMap().forEach((key, apiResponse) -> {
+				if (!genericApiResponseMap.containsKey(key))
+					genericApiResponseMap.put(key, apiResponse);
+			});
+		}
 
-			LinkedHashMap<String, ApiResponse> genericApiResponsesClone;
-			try {
-				ObjectMapper objectMapper = ObjectMapperProvider.createJson(springDocConfigProperties);
-				genericApiResponsesClone = objectMapper.readValue(objectMapper.writeValueAsString(genericApiResponseMap), ApiResponses.class);
-				return genericApiResponsesClone;
-			}
-			catch (JsonProcessingException e) {
-				LOGGER.warn("Json Processing Exception occurred: {}", e.getMessage());
-				return genericApiResponseMap;
-			}
+		LinkedHashMap<String, ApiResponse> genericApiResponsesClone;
+		try {
+			ObjectMapper objectMapper = ObjectMapperProvider.createJson(springDocConfigProperties);
+			genericApiResponsesClone = objectMapper.readValue(objectMapper.writeValueAsString(genericApiResponseMap), ApiResponses.class);
+			return genericApiResponsesClone;
 		}
-		finally {
-			reentrantLock.unlock();
+		catch (JsonProcessingException e) {
+			LOGGER.warn("Json Processing Exception occurred: {}", e.getMessage());
+			return genericApiResponseMap;
 		}
 	}
 
 	/**
 	 * Is valid http code boolean.
 	 *
-	 * @param httpCode        the http code
+	 * @param httpCode the http code
 	 * @param methodParameter the method parameter
 	 * @return the boolean
 	 */
@@ -756,7 +742,7 @@ public class GenericResponseService {
 	/**
 	 * Is http code present boolean.
 	 *
-	 * @param httpCode    the http code
+	 * @param httpCode the http code
 	 * @param responseSet the response set
 	 * @return the boolean
 	 */
diff --git a/springdoc-openapi-starter-webflux-api/pom.xml b/springdoc-openapi-starter-webflux-api/pom.xml
index 2c14167f5..576a14f09 100644
--- a/springdoc-openapi-starter-webflux-api/pom.xml
+++ b/springdoc-openapi-starter-webflux-api/pom.xml
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.springdoc</groupId>
 		<artifactId>springdoc-openapi</artifactId>
-		<version>2.2.1-SNAPSHOT</version>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 	<artifactId>springdoc-openapi-starter-webflux-api</artifactId>
 	<dependencies>
diff --git a/springdoc-openapi-starter-webflux-ui/pom.xml b/springdoc-openapi-starter-webflux-ui/pom.xml
index d678709da..b477a6fcf 100644
--- a/springdoc-openapi-starter-webflux-ui/pom.xml
+++ b/springdoc-openapi-starter-webflux-ui/pom.xml
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.springdoc</groupId>
 		<artifactId>springdoc-openapi</artifactId>
-		<version>2.2.1-SNAPSHOT</version>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 	<artifactId>springdoc-openapi-starter-webflux-ui</artifactId>
 	<dependencies>
diff --git a/springdoc-openapi-starter-webmvc-api/pom.xml b/springdoc-openapi-starter-webmvc-api/pom.xml
index 77eb0b322..2015940dc 100644
--- a/springdoc-openapi-starter-webmvc-api/pom.xml
+++ b/springdoc-openapi-starter-webmvc-api/pom.xml
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.springdoc</groupId>
 		<artifactId>springdoc-openapi</artifactId>
-		<version>2.2.1-SNAPSHOT</version>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 	<artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
 	<dependencies>
diff --git a/springdoc-openapi-starter-webmvc-ui/pom.xml b/springdoc-openapi-starter-webmvc-ui/pom.xml
index 4b6d8733d..3b94064b8 100644
--- a/springdoc-openapi-starter-webmvc-ui/pom.xml
+++ b/springdoc-openapi-starter-webmvc-ui/pom.xml
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.springdoc</groupId>
 		<artifactId>springdoc-openapi</artifactId>
-		<version>2.2.1-SNAPSHOT</version>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 	<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
 	<dependencies>
diff --git a/springdoc-openapi-starter-webmvc-ui/src/main/java/org/springdoc/webmvc/ui/SwaggerWelcomeWebMvc.java b/springdoc-openapi-starter-webmvc-ui/src/main/java/org/springdoc/webmvc/ui/SwaggerWelcomeWebMvc.java
index fbdd50511..b9f01febf 100644
--- a/springdoc-openapi-starter-webmvc-ui/src/main/java/org/springdoc/webmvc/ui/SwaggerWelcomeWebMvc.java
+++ b/springdoc-openapi-starter-webmvc-ui/src/main/java/org/springdoc/webmvc/ui/SwaggerWelcomeWebMvc.java
@@ -26,6 +26,7 @@ package org.springdoc.webmvc.ui;
 
 import io.swagger.v3.oas.annotations.Operation;
 import jakarta.servlet.http.HttpServletRequest;
+import org.apache.commons.lang3.StringUtils;
 import org.springdoc.core.properties.SpringDocConfigProperties;
 import org.springdoc.core.properties.SwaggerUiConfigParameters;
 import org.springdoc.core.properties.SwaggerUiConfigProperties;


Test patch:
diff --git a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app106.json b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app106.json
index 57677aa0f..37b143029 100644
--- a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app106.json
+++ b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app106.json
@@ -17,7 +17,7 @@
           "hello-controller"
         ],
         "summary": "find-articles",
-        "operationId": "findArticles_1",
+        "operationId": "findArticles",
         "parameters": [
           {
             "name": "If-Modified-Since",
diff --git a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app108.json b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app108.json
index 8375715aa..e4e98e576 100644
--- a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app108.json
+++ b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app108.json
@@ -16,7 +16,7 @@
         "tags": [
           "hello-controller"
         ],
-        "operationId": "update_1",
+        "operationId": "update",
         "parameters": [
           {
             "name": "toto",
diff --git a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app122.json b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app122.json
index d7a836d13..ed18e58c0 100644
--- a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app122.json
+++ b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app122.json
@@ -17,7 +17,7 @@
           "example"
         ],
         "summary": "create",
-        "operationId": "create_1",
+        "operationId": "create",
         "requestBody": {
           "content": {
             "application/json": {
diff --git a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app126.json b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app126.json
index 442057409..769d444ad 100644
--- a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app126.json
+++ b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app126.json
@@ -18,7 +18,7 @@
         ],
         "summary": "getAllCurrencies",
         "description": "Get all currencies",
-        "operationId": "getAllCurrencies_1",
+        "operationId": "getAllCurrencies",
         "responses": {
           "401": {
             "$ref": "#/components/responses/http401NoToken"
@@ -65,12 +65,12 @@
           "title": {
             "type": "string"
           },
-          "detail": {
-            "type": "string"
-          },
           "status": {
             "type": "integer",
             "format": "int32"
+          },
+          "detail": {
+            "type": "string"
           }
         }
       }
diff --git a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app161.json b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app161.json
index e425730c0..a80c0f9ba 100644
--- a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app161.json
+++ b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app161.json
@@ -11,25 +11,29 @@
     }
   ],
   "paths": {
-    "/add": {
+    "/": {
       "post": {
         "tags": [
           "hello-controller"
         ],
-        "summary": "add",
-        "operationId": "add",
+        "summary": "This is a test message",
+        "operationId": "test",
         "requestBody": {
           "content": {
             "multipart/form-data": {
               "schema": {
                 "required": [
-                  "content"
+                  "intValue",
+                  "strValue"
                 ],
                 "type": "object",
                 "properties": {
-                  "content": {
-                    "type": "string",
-                    "description": "content"
+                  "strValue": {
+                    "type": "string"
+                  },
+                  "intValue": {
+                    "type": "integer",
+                    "format": "int32"
                   }
                 }
               }
@@ -43,29 +47,25 @@
         }
       }
     },
-    "/add2": {
+    "/add": {
       "post": {
         "tags": [
           "hello-controller"
         ],
-        "summary": "add2",
-        "operationId": "add2",
+        "summary": "add",
+        "operationId": "add",
         "requestBody": {
           "content": {
             "multipart/form-data": {
               "schema": {
                 "required": [
-                  "content",
-                  "type"
+                  "content"
                 ],
                 "type": "object",
                 "properties": {
                   "content": {
                     "type": "string",
                     "description": "content"
-                  },
-                  "type": {
-                    "type": "string"
                   }
                 }
               }
@@ -79,29 +79,29 @@
         }
       }
     },
-    "/": {
+    "/add2": {
       "post": {
         "tags": [
           "hello-controller"
         ],
-        "summary": "This is a test message",
-        "operationId": "test_1",
+        "summary": "add2",
+        "operationId": "add2",
         "requestBody": {
           "content": {
             "multipart/form-data": {
               "schema": {
                 "required": [
-                  "intValue",
-                  "strValue"
+                  "content",
+                  "type"
                 ],
                 "type": "object",
                 "properties": {
-                  "strValue": {
-                    "type": "string"
+                  "content": {
+                    "type": "string",
+                    "description": "content"
                   },
-                  "intValue": {
-                    "type": "integer",
-                    "format": "int32"
+                  "type": {
+                    "type": "string"
                   }
                 }
               }
diff --git a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app198.json b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app198.json
index d7fb08a57..7a0d6620f 100644
--- a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app198.json
+++ b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app198.json
@@ -16,7 +16,7 @@
         "tags": [
           "hello-controller"
         ],
-        "operationId": "test_1",
+        "operationId": "test",
         "responses": {
           "200": {
             "description": "OK",
@@ -54,4 +54,4 @@
       }
     }
   }
-}
+}
\ No newline at end of file
diff --git a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app206.json b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app206.json
index 165ccf314..c6f7527e5 100644
--- a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app206.json
+++ b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app206.json
@@ -16,7 +16,7 @@
         "tags": [
           "required-mode-controller"
         ],
-        "operationId": "index_1",
+        "operationId": "index",
         "parameters": [
           {
             "name": "id",
diff --git a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app51.json b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app51.json
index 55e35e2b6..79655c717 100644
--- a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app51.json
+++ b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app51.json
@@ -11,35 +11,29 @@
     }
   ],
   "paths": {
-    "/": {
-      "post": {
+    "/test/{path}": {
+      "get": {
         "tags": [
           "hello-controller"
         ],
-        "operationId": "hello_1",
-        "requestBody": {
-          "content": {
-            "application/json": {
-              "schema": {
-                "type": "object",
-                "additionalProperties": {
-                  "type": "object"
-                }
-              }
+        "operationId": "get",
+        "parameters": [
+          {
+            "name": "path",
+            "in": "path",
+            "required": true,
+            "schema": {
+              "type": "string"
             }
-          },
-          "required": true
-        },
+          }
+        ],
         "responses": {
           "200": {
             "description": "OK",
             "content": {
               "*/*": {
                 "schema": {
-                  "type": "object",
-                  "additionalProperties": {
-                    "type": "object"
-                  }
+                  "type": "string"
                 }
               }
             }
@@ -88,12 +82,12 @@
         }
       }
     },
-    "/test2": {
+    "/test1": {
       "get": {
         "tags": [
           "hello-controller"
         ],
-        "operationId": "test2",
+        "operationId": "test1",
         "parameters": [
           {
             "name": "test_header",
@@ -103,14 +97,6 @@
               "type": "string",
               "example": "rherherherherh"
             }
-          },
-          {
-            "name": "param1",
-            "in": "query",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
           }
         ],
         "responses": {
@@ -127,12 +113,12 @@
         }
       }
     },
-    "/test1": {
+    "/test2": {
       "get": {
         "tags": [
           "hello-controller"
         ],
-        "operationId": "test1",
+        "operationId": "test2",
         "parameters": [
           {
             "name": "test_header",
@@ -142,6 +128,14 @@
               "type": "string",
               "example": "rherherherherh"
             }
+          },
+          {
+            "name": "param1",
+            "in": "query",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
           }
         ],
         "responses": {
@@ -158,29 +152,35 @@
         }
       }
     },
-    "/test/{path}": {
-      "get": {
+    "/": {
+      "post": {
         "tags": [
           "hello-controller"
         ],
-        "operationId": "get",
-        "parameters": [
-          {
-            "name": "path",
-            "in": "path",
-            "required": true,
-            "schema": {
-              "type": "string"
+        "operationId": "hello",
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "type": "object",
+                "additionalProperties": {
+                  "type": "object"
+                }
+              }
             }
-          }
-        ],
+          },
+          "required": true
+        },
         "responses": {
           "200": {
             "description": "OK",
             "content": {
               "*/*": {
                 "schema": {
-                  "type": "string"
+                  "type": "object",
+                  "additionalProperties": {
+                    "type": "object"
+                  }
                 }
               }
             }
@@ -190,4 +190,4 @@
     }
   },
   "components": {}
-}
\ No newline at end of file
+}
diff --git a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app91.json b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app91.json
index 32d710f08..6ed478cb7 100644
--- a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app91.json
+++ b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app91.json
@@ -17,23 +17,34 @@
     }
   ],
   "paths": {
-    "/test": {
+    "/": {
       "get": {
         "tags": [
           "Demo"
         ],
-        "operationId": "sayHello2",
+        "summary": "This API will return a random greeting.",
+        "operationId": "sayHello",
         "responses": {
-          "201": {
-            "description": "item created",
+          "200": {
+            "description": "OK",
             "content": {
-              "*/*": {
+              "application/json": {
                 "schema": {
                   "$ref": "#/components/schemas/Greeting"
                 }
               }
             }
-          },
+          }
+        }
+      }
+    },
+    "/test": {
+      "get": {
+        "tags": [
+          "Demo"
+        ],
+        "operationId": "sayHello2",
+        "responses": {
           "400": {
             "description": "invalid input, object invalid",
             "content": {
@@ -44,8 +55,8 @@
               }
             }
           },
-          "409": {
-            "description": "an existing item already exists",
+          "201": {
+            "description": "item created",
             "content": {
               "*/*": {
                 "schema": {
@@ -53,22 +64,11 @@
                 }
               }
             }
-          }
-        }
-      }
-    },
-    "/": {
-      "get": {
-        "tags": [
-          "Demo"
-        ],
-        "summary": "This API will return a random greeting.",
-        "operationId": "sayHello_1",
-        "responses": {
-          "200": {
-            "description": "OK",
+          },
+          "409": {
+            "description": "an existing item already exists",
             "content": {
-              "application/json": {
+              "*/*": {
                 "schema": {
                   "$ref": "#/components/schemas/Greeting"
                 }
diff --git a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app93.json b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app93.json
index 62cade080..462cfe210 100644
--- a/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app93.json
+++ b/springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app93.json
@@ -16,7 +16,7 @@
         "tags": [
           "specific-controller"
         ],
-        "operationId": "get_1",
+        "operationId": "get",
         "parameters": [
           {
             "name": "param",
diff --git a/springdoc-openapi-tests/pom.xml b/springdoc-openapi-tests/pom.xml
index 4d2b3cd81..8665515c8 100644
--- a/springdoc-openapi-tests/pom.xml
+++ b/springdoc-openapi-tests/pom.xml
@@ -2,7 +2,7 @@
 	<parent>
 		<artifactId>springdoc-openapi</artifactId>
 		<groupId>org.springdoc</groupId>
-		<version>2.2.1-SNAPSHOT</version>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 	<packaging>pom</packaging>
 	<modelVersion>4.0.0</modelVersion>
diff --git a/springdoc-openapi-tests/springdoc-openapi-actuator-webflux-tests/pom.xml b/springdoc-openapi-tests/springdoc-openapi-actuator-webflux-tests/pom.xml
index 5cdb0ed36..aed68d81b 100644
--- a/springdoc-openapi-tests/springdoc-openapi-actuator-webflux-tests/pom.xml
+++ b/springdoc-openapi-tests/springdoc-openapi-actuator-webflux-tests/pom.xml
@@ -2,7 +2,7 @@
 	<parent>
 		<artifactId>springdoc-openapi-tests</artifactId>
 		<groupId>org.springdoc</groupId>
-		<version>2.2.1-SNAPSHOT</version>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 	<modelVersion>4.0.0</modelVersion>
 
diff --git a/springdoc-openapi-tests/springdoc-openapi-actuator-webmvc-tests/pom.xml b/springdoc-openapi-tests/springdoc-openapi-actuator-webmvc-tests/pom.xml
index e74d577b4..3c2e584f1 100644
--- a/springdoc-openapi-tests/springdoc-openapi-actuator-webmvc-tests/pom.xml
+++ b/springdoc-openapi-tests/springdoc-openapi-actuator-webmvc-tests/pom.xml
@@ -2,7 +2,7 @@
 	<parent>
 		<artifactId>springdoc-openapi-tests</artifactId>
 		<groupId>org.springdoc</groupId>
-		<version>2.2.1-SNAPSHOT</version>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 	<modelVersion>4.0.0</modelVersion>
 
diff --git a/springdoc-openapi-tests/springdoc-openapi-data-rest-tests/pom.xml b/springdoc-openapi-tests/springdoc-openapi-data-rest-tests/pom.xml
index d867901a8..324c12db0 100644
--- a/springdoc-openapi-tests/springdoc-openapi-data-rest-tests/pom.xml
+++ b/springdoc-openapi-tests/springdoc-openapi-data-rest-tests/pom.xml
@@ -2,7 +2,7 @@
 	<parent>
 		<artifactId>springdoc-openapi-tests</artifactId>
 		<groupId>org.springdoc</groupId>
-		<version>2.2.1-SNAPSHOT</version>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 	<modelVersion>4.0.0</modelVersion>
 	<artifactId>springdoc-openapi-data-rest-tests</artifactId>
diff --git a/springdoc-openapi-tests/springdoc-openapi-function-webflux-tests/pom.xml b/springdoc-openapi-tests/springdoc-openapi-function-webflux-tests/pom.xml
index cb3b78082..e0395ad15 100644
--- a/springdoc-openapi-tests/springdoc-openapi-function-webflux-tests/pom.xml
+++ b/springdoc-openapi-tests/springdoc-openapi-function-webflux-tests/pom.xml
@@ -2,7 +2,7 @@
 	<parent>
 		<artifactId>springdoc-openapi-tests</artifactId>
 		<groupId>org.springdoc</groupId>
-		<version>2.2.1-SNAPSHOT</version>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 	<modelVersion>4.0.0</modelVersion>
 
diff --git a/springdoc-openapi-tests/springdoc-openapi-function-webmvc-tests/pom.xml b/springdoc-openapi-tests/springdoc-openapi-function-webmvc-tests/pom.xml
index a90585ac3..2b0b53c41 100644
--- a/springdoc-openapi-tests/springdoc-openapi-function-webmvc-tests/pom.xml
+++ b/springdoc-openapi-tests/springdoc-openapi-function-webmvc-tests/pom.xml
@@ -2,7 +2,7 @@
 	<parent>
 		<artifactId>springdoc-openapi-tests</artifactId>
 		<groupId>org.springdoc</groupId>
-		<version>2.2.1-SNAPSHOT</version>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 	<modelVersion>4.0.0</modelVersion>
 
diff --git a/springdoc-openapi-tests/springdoc-openapi-groovy-tests/pom.xml b/springdoc-openapi-tests/springdoc-openapi-groovy-tests/pom.xml
index e51b397c8..d93467a70 100644
--- a/springdoc-openapi-tests/springdoc-openapi-groovy-tests/pom.xml
+++ b/springdoc-openapi-tests/springdoc-openapi-groovy-tests/pom.xml
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.springdoc</groupId>
 		<artifactId>springdoc-openapi-tests</artifactId>
-		<version>2.2.1-SNAPSHOT</version>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 	<artifactId>springdoc-openapi-groovy-tests</artifactId>
 	<dependencies>
diff --git a/springdoc-openapi-tests/springdoc-openapi-hateoas-tests/pom.xml b/springdoc-openapi-tests/springdoc-openapi-hateoas-tests/pom.xml
index dbdc2ef97..59054dac8 100644
--- a/springdoc-openapi-tests/springdoc-openapi-hateoas-tests/pom.xml
+++ b/springdoc-openapi-tests/springdoc-openapi-hateoas-tests/pom.xml
@@ -2,7 +2,7 @@
 	<parent>
 		<artifactId>springdoc-openapi-tests</artifactId>
 		<groupId>org.springdoc</groupId>
-		<version>2.2.1-SNAPSHOT</version>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 	<modelVersion>4.0.0</modelVersion>
 	<artifactId>springdoc-openapi-hateoas-tests</artifactId>
diff --git a/springdoc-openapi-tests/springdoc-openapi-hateoas-tests/src/test/resources/results/app2.json b/springdoc-openapi-tests/springdoc-openapi-hateoas-tests/src/test/resources/results/app2.json
index d5a37d2c6..79166c2c6 100644
--- a/springdoc-openapi-tests/springdoc-openapi-hateoas-tests/src/test/resources/results/app2.json
+++ b/springdoc-openapi-tests/springdoc-openapi-hateoas-tests/src/test/resources/results/app2.json
@@ -16,7 +16,7 @@
         "tags": [
           "post-controller"
         ],
-        "operationId": "getAll_1",
+        "operationId": "getAll",
         "parameters": [
           {
             "name": "pageable",
diff --git a/springdoc-openapi-tests/springdoc-openapi-hateoas-tests/src/test/resources/results/app5.json b/springdoc-openapi-tests/springdoc-openapi-hateoas-tests/src/test/resources/results/app5.json
index c06ac725a..5bf9f83e8 100644
--- a/springdoc-openapi-tests/springdoc-openapi-hateoas-tests/src/test/resources/results/app5.json
+++ b/springdoc-openapi-tests/springdoc-openapi-hateoas-tests/src/test/resources/results/app5.json
@@ -16,7 +16,7 @@
         "tags": [
           "company-controller"
         ],
-        "operationId": "create_1",
+        "operationId": "create",
         "requestBody": {
           "description": "Details of the Item to be created",
           "content": {
diff --git a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/pom.xml b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/pom.xml
index 70649fe75..a10aa66df 100644
--- a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/pom.xml
+++ b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/pom.xml
@@ -2,7 +2,7 @@
 	<parent>
 		<groupId>org.springdoc</groupId>
 		<artifactId>springdoc-openapi-tests</artifactId>
-		<version>2.2.1-SNAPSHOT</version>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 	<modelVersion>4.0.0</modelVersion>
 
diff --git a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app106.json b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app106.json
index 2b4c457c9..88bea26f0 100644
--- a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app106.json
+++ b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app106.json
@@ -24,7 +24,7 @@
         ],
         "summary": "find-articles",
         "description": "Find articles response entity.",
-        "operationId": "findArticles_1",
+        "operationId": "findArticles",
         "parameters": [
           {
             "name": "If-Modified-Since",
@@ -54,4 +54,4 @@
     }
   },
   "components": {}
-}
+}
\ No newline at end of file
diff --git a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app108.json b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app108.json
index f6ae41597..76477a2aa 100644
--- a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app108.json
+++ b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app108.json
@@ -24,7 +24,7 @@
         ],
         "summary": "Update action result.",
         "description": "Update action result.",
-        "operationId": "update_1",
+        "operationId": "update",
         "parameters": [
           {
             "name": "toto",
@@ -85,4 +85,4 @@
       }
     }
   }
-}
+}
\ No newline at end of file
diff --git a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app122.json b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app122.json
index 809a45a51..a8e654275 100644
--- a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app122.json
+++ b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app122.json
@@ -18,7 +18,7 @@
         ],
         "summary": "create",
         "description": "Create response entity.",
-        "operationId": "create_1",
+        "operationId": "create",
         "requestBody": {
           "description": "the payload",
           "content": {
diff --git a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app126.json b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app126.json
index 583d687ca..6827b7338 100644
--- a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app126.json
+++ b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app126.json
@@ -24,7 +24,7 @@
         ],
         "summary": "getAllCurrencies",
         "description": "Get all currencies",
-        "operationId": "getAllCurrencies_1",
+        "operationId": "getAllCurrencies",
         "responses": {
           "401": {
             "$ref": "#/components/responses/http401NoToken"
@@ -68,13 +68,13 @@
               "type": "object"
             }
           },
-          "title": {
-            "type": "string"
-          },
           "status": {
             "type": "integer",
             "format": "int32"
           },
+          "title": {
+            "type": "string"
+          },
           "detail": {
             "type": "string"
           }
diff --git a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app161.json b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app161.json
index 9c53f3193..1999625b4 100644
--- a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app161.json
+++ b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app161.json
@@ -17,26 +17,32 @@
     }
   ],
   "paths": {
-    "/add": {
+    "/": {
       "post": {
         "tags": [
           "hello-controller"
         ],
-        "summary": "add",
-        "description": "Add response entity.",
-        "operationId": "add",
+        "summary": "test",
+        "description": "Test.",
+        "operationId": "test",
         "requestBody": {
           "content": {
             "multipart/form-data": {
               "schema": {
                 "required": [
-                  "content"
+                  "intValue",
+                  "strValue"
                 ],
                 "type": "object",
                 "properties": {
-                  "content": {
+                  "strValue": {
                     "type": "string",
-                    "description": "content"
+                    "description": "the str value"
+                  },
+                  "intValue": {
+                    "type": "integer",
+                    "description": "the int value",
+                    "format": "int32"
                   }
                 }
               }
@@ -45,36 +51,31 @@
         },
         "responses": {
           "200": {
-            "description": "the response entity"
+            "description": "OK"
           }
         }
       }
     },
-    "/add2": {
+    "/add": {
       "post": {
         "tags": [
           "hello-controller"
         ],
-        "summary": "add2",
-        "description": "Add 2 response entity.",
-        "operationId": "add2",
+        "summary": "add",
+        "description": "Add response entity.",
+        "operationId": "add",
         "requestBody": {
           "content": {
             "multipart/form-data": {
               "schema": {
                 "required": [
-                  "content",
-                  "type"
+                  "content"
                 ],
                 "type": "object",
                 "properties": {
                   "content": {
                     "type": "string",
                     "description": "content"
-                  },
-                  "type": {
-                    "type": "string",
-                    "description": "the type"
                   }
                 }
               }
@@ -88,32 +89,31 @@
         }
       }
     },
-    "/": {
+    "/add2": {
       "post": {
         "tags": [
           "hello-controller"
         ],
-        "summary": "test",
-        "description": "Test.",
-        "operationId": "test_1",
+        "summary": "add2",
+        "description": "Add 2 response entity.",
+        "operationId": "add2",
         "requestBody": {
           "content": {
             "multipart/form-data": {
               "schema": {
                 "required": [
-                  "intValue",
-                  "strValue"
+                  "content",
+                  "type"
                 ],
                 "type": "object",
                 "properties": {
-                  "strValue": {
+                  "content": {
                     "type": "string",
-                    "description": "the str value"
+                    "description": "content"
                   },
-                  "intValue": {
-                    "type": "integer",
-                    "description": "the int value",
-                    "format": "int32"
+                  "type": {
+                    "type": "string",
+                    "description": "the type"
                   }
                 }
               }
@@ -122,7 +122,7 @@
         },
         "responses": {
           "200": {
-            "description": "OK"
+            "description": "the response entity"
           }
         }
       }
diff --git a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app3.json b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app3.json
index 4f219bdc2..5333cf8d3 100644
--- a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app3.json
+++ b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app3.json
@@ -24,7 +24,7 @@
         ],
         "summary": "Echo playing card.",
         "description": "Echo playing card.",
-        "operationId": "echo_1",
+        "operationId": "echo",
         "parameters": [
           {
             "name": "toto",
@@ -110,4 +110,4 @@
       }
     }
   }
-}
+}
\ No newline at end of file
diff --git a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app51.json b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app51.json
index 038c2a74b..eb26fd91a 100644
--- a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app51.json
+++ b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app51.json
@@ -24,7 +24,7 @@
         ],
         "summary": "Hello response entity.",
         "description": "Hello response entity.",
-        "operationId": "hello_1",
+        "operationId": "hello",
         "requestBody": {
           "description": "the map",
           "content": {
@@ -56,6 +56,39 @@
         }
       }
     },
+    "/test/{path}": {
+      "get": {
+        "tags": [
+          "hello-controller"
+        ],
+        "summary": "Get string.",
+        "description": "Get string.",
+        "operationId": "get",
+        "parameters": [
+          {
+            "name": "path",
+            "in": "path",
+            "description": "the path",
+            "required": true,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "the string",
+            "content": {
+              "*/*": {
+                "schema": {
+                  "type": "string"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
     "/test3": {
       "get": {
         "tags": [
@@ -173,40 +206,7 @@
           }
         }
       }
-    },
-    "/test/{path}": {
-      "get": {
-        "tags": [
-          "hello-controller"
-        ],
-        "summary": "Get string.",
-        "description": "Get string.",
-        "operationId": "get",
-        "parameters": [
-          {
-            "name": "path",
-            "in": "path",
-            "description": "the path",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "the string",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "string"
-                }
-              }
-            }
-          }
-        }
-      }
     }
   },
   "components": {}
-}
+}
\ No newline at end of file
diff --git a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app91.json b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app91.json
index f3d2f44a4..7fd0db639 100644
--- a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app91.json
+++ b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app91.json
@@ -24,7 +24,7 @@
         ],
         "summary": "This API will return a random greeting.",
         "description": "Say hello response entity.",
-        "operationId": "sayHello_1",
+        "operationId": "sayHello",
         "responses": {
           "200": {
             "description": "the response entity",
@@ -98,4 +98,4 @@
       }
     }
   }
-}
+}
\ No newline at end of file
diff --git a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app93.json b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app93.json
index 5509594a8..d8c40eab9 100644
--- a/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app93.json
+++ b/springdoc-openapi-tests/springdoc-openapi-javadoc-tests/src/test/resources/results/app93.json
@@ -24,7 +24,7 @@
         ],
         "summary": "Get t client model.",
         "description": "Get t client model.",
-        "operationId": "get_1",
+        "operationId": "get",
         "parameters": [
           {
             "name": "param",
@@ -70,4 +70,4 @@
       }
     }
   }
-}
+}
\ No newline at end of file
diff --git a/springdoc-openapi-tests/springdoc-openapi-kotlin-tests/pom.xml b/springdoc-openapi-tests/springdoc-openapi-kotlin-tests/pom.xml
index 0efe31d01..00167a6c3 100644
--- a/springdoc-openapi-tests/springdoc-openapi-kotlin-tests/pom.xml
+++ b/springdoc-openapi-tests/springdoc-openapi-kotlin-tests/pom.xml
@@ -2,7 +2,7 @@
 	<parent>
 		<artifactId>springdoc-openapi-tests</artifactId>
 		<groupId>org.springdoc</groupId>
-		<version>2.2.1-SNAPSHOT</version>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 	<modelVersion>4.0.0</modelVersion>
 	<artifactId>springdoc-openapi-kotlin-tests</artifactId>
diff --git a/springdoc-openapi-tests/springdoc-openapi-security-tests/pom.xml b/springdoc-openapi-tests/springdoc-openapi-security-tests/pom.xml
index b43ff6b70..831f9526b 100644
--- a/springdoc-openapi-tests/springdoc-openapi-security-tests/pom.xml
+++ b/springdoc-openapi-tests/springdoc-openapi-security-tests/pom.xml
@@ -3,7 +3,7 @@
 	<parent>
 		<groupId>org.springdoc</groupId>
 		<artifactId>springdoc-openapi-tests</artifactId>
-		<version>2.2.1-SNAPSHOT</version>
+		<version>2.1.1-SNAPSHOT</version>
 	</parent>
 	<artifactId>springdoc-openapi-security-tests</artifactId>
 	<properties>
diff --git a/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app11/AuthorizationServerConfig.java b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app11/AuthorizationServerConfig.java
new file mode 100644
index 000000000..f9e60d6ac
--- /dev/null
+++ b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app11/AuthorizationServerConfig.java
@@ -0,0 +1,75 @@
+package test.org.springdoc.api.app11;
+
+import java.util.UUID;
+
+import com.nimbusds.jose.jwk.JWKSet;
+import com.nimbusds.jose.jwk.RSAKey;
+import com.nimbusds.jose.jwk.source.JWKSource;
+import com.nimbusds.jose.proc.SecurityContext;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.Customizer;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.oauth2.core.AuthorizationGrantType;
+import org.springframework.security.oauth2.jwt.JwtDecoder;
+import org.springframework.security.oauth2.server.authorization.InMemoryOAuth2AuthorizationService;
+import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
+import org.springframework.security.oauth2.server.authorization.client.InMemoryRegisteredClientRepository;
+import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
+import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
+import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
+import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer;
+import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
+import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
+import org.springframework.security.web.SecurityFilterChain;
+
+/*
+ * @author yuta.saito
+ */
+@Configuration
+public class AuthorizationServerConfig {
+	@Bean
+	public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
+		OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
+		http.getConfigurer(OAuth2AuthorizationServerConfigurer.class)
+				.oidc(Customizer.withDefaults());
+		return http.build();
+	}
+
+	@Bean
+	public RegisteredClientRepository registeredClientRepository() {
+		RegisteredClient registeredClient = RegisteredClient.withId(UUID.randomUUID().toString())
+				.clientId("messaging-client")
+				.clientSecret("{noop}secret")
+				.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
+				.scope("message.read")
+				.scope("message.write")
+				.clientSettings(ClientSettings.builder().requireAuthorizationConsent(true).build())
+				.build();
+
+		return new InMemoryRegisteredClientRepository(registeredClient);
+	}
+
+	@Bean
+	public OAuth2AuthorizationService authorizationService() {
+		return new InMemoryOAuth2AuthorizationService();
+	}
+
+	@Bean
+	public AuthorizationServerSettings authorizationServerSettings() {
+		return AuthorizationServerSettings.builder().build();
+	}
+
+	@Bean
+	public JWKSource<SecurityContext> jwkSource() {
+		RSAKey rsaKey = Jwks.generateRsa();
+		JWKSet jwkSet = new JWKSet(rsaKey);
+		return (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);
+	}
+
+	@Bean
+	public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
+		return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
+	}
+}
diff --git a/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app11/HelloController.java b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app11/HelloController.java
new file mode 100644
index 000000000..52548cd1f
--- /dev/null
+++ b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app11/HelloController.java
@@ -0,0 +1,17 @@
+package test.org.springdoc.api.app11;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/*
+ * @author yuta.saito
+ */
+@RestController
+@RequestMapping("/api")
+public class HelloController {
+	@GetMapping("/hello")
+	public String hello() {
+		return "Hello";
+	}
+}
diff --git a/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app11/Jwks.java b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app11/Jwks.java
new file mode 100644
index 000000000..ab8d9cc79
--- /dev/null
+++ b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app11/Jwks.java
@@ -0,0 +1,29 @@
+package test.org.springdoc.api.app11;
+
+
+import java.security.KeyPair;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.util.UUID;
+
+import com.nimbusds.jose.jwk.RSAKey;
+
+
+/**
+ * @author yuta.saito
+ */
+public final class Jwks {
+	private Jwks() {
+		//final class constructor should be hidden
+	}
+
+	public static RSAKey generateRsa() {
+		KeyPair keyPair = KeyGeneratorUtils.generateRsaKey();
+		RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
+		RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
+		return new RSAKey.Builder(publicKey)
+				.privateKey(privateKey)
+				.keyID(UUID.randomUUID().toString())
+				.build();
+	}
+}
diff --git a/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app11/KeyGeneratorUtils.java b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app11/KeyGeneratorUtils.java
new file mode 100644
index 000000000..49ae4597d
--- /dev/null
+++ b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app11/KeyGeneratorUtils.java
@@ -0,0 +1,26 @@
+package test.org.springdoc.api.app11;
+
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+
+/**
+ * @author yuta.saito
+ */
+public final class KeyGeneratorUtils {
+	private KeyGeneratorUtils() {
+		//final class constructor should be hidden
+	}
+
+	static KeyPair generateRsaKey() {
+		KeyPair keyPair;
+		try {
+			KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
+			keyPairGenerator.initialize(2048);
+			keyPair = keyPairGenerator.generateKeyPair();
+		}
+		catch (Exception ex) {
+			throw new IllegalStateException(ex);
+		}
+		return keyPair;
+	}
+}
diff --git a/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app11/SpringDocApp11Test.java b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app11/SpringDocApp11Test.java
new file mode 100644
index 000000000..91cf142a9
--- /dev/null
+++ b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app11/SpringDocApp11Test.java
@@ -0,0 +1,56 @@
+/*
+ *
+ *  * Copyright 2019-2023 the original author or authors.
+ *  *
+ *  * Licensed under the Apache License, Version 2.0 (the "License");
+ *  * you may not use this file except in compliance with the License.
+ *  * You may obtain a copy of the License at
+ *  *
+ *  *      https://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.
+ *
+ */
+
+package test.org.springdoc.api.app11;
+
+import java.util.Optional;
+
+import io.swagger.v3.core.converter.ModelConverter;
+import io.swagger.v3.core.converter.ModelConverters;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.springdoc.core.converters.SchemaPropertyDeprecatingConverter;
+import test.org.springdoc.api.AbstractSpringDocTest;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.test.context.TestPropertySource;
+
+@TestPropertySource(properties = { "springdoc.show-oauth2-endpoints=true", "springdoc.model-converters.deprecating-converter.enabled=false" })
+public class SpringDocApp11Test extends AbstractSpringDocTest {
+
+	@BeforeAll
+	public static void init() {
+		Optional<ModelConverter> deprecatingConverterOptional =
+				ModelConverters.getInstance().getConverters()
+						.stream().filter(modelConverter -> modelConverter instanceof SchemaPropertyDeprecatingConverter).findAny();
+		deprecatingConverterOptional.ifPresent(ModelConverters.getInstance()::removeConverter);
+	}
+
+	@AfterAll
+	public static void clean() {
+		Optional<ModelConverter> deprecatingConverterOptional =
+				ModelConverters.getInstance().getConverters()
+						.stream().filter(modelConverter -> modelConverter instanceof SchemaPropertyDeprecatingConverter).findAny();
+		deprecatingConverterOptional.ifPresent(ModelConverters.getInstance()::addConverter);
+	}
+
+	@SpringBootApplication
+	static class SpringDocTestApp {
+	}
+
+}
diff --git a/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app12/AuthorizationServerConfig.java b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app12/AuthorizationServerConfig.java
new file mode 100644
index 000000000..06a888fe6
--- /dev/null
+++ b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app12/AuthorizationServerConfig.java
@@ -0,0 +1,75 @@
+package test.org.springdoc.api.app12;
+
+import java.util.UUID;
+
+import com.nimbusds.jose.jwk.JWKSet;
+import com.nimbusds.jose.jwk.RSAKey;
+import com.nimbusds.jose.jwk.source.JWKSource;
+import com.nimbusds.jose.proc.SecurityContext;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.Customizer;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.oauth2.core.AuthorizationGrantType;
+import org.springframework.security.oauth2.jwt.JwtDecoder;
+import org.springframework.security.oauth2.server.authorization.InMemoryOAuth2AuthorizationService;
+import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
+import org.springframework.security.oauth2.server.authorization.client.InMemoryRegisteredClientRepository;
+import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
+import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
+import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
+import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer;
+import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
+import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
+import org.springframework.security.web.SecurityFilterChain;
+
+/*
+ * @author yuta.saito
+ */
+@Configuration
+public class AuthorizationServerConfig {
+	@Bean
+	public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
+		OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
+		http.getConfigurer(OAuth2AuthorizationServerConfigurer.class)
+				.oidc(oidc -> oidc.clientRegistrationEndpoint(Customizer.withDefaults()));
+		return http.build();
+	}
+
+	@Bean
+	public RegisteredClientRepository registeredClientRepository() {
+		RegisteredClient registeredClient = RegisteredClient.withId(UUID.randomUUID().toString())
+				.clientId("messaging-client")
+				.clientSecret("{noop}secret")
+				.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
+				.scope("message.read")
+				.scope("message.write")
+				.clientSettings(ClientSettings.builder().requireAuthorizationConsent(true).build())
+				.build();
+
+		return new InMemoryRegisteredClientRepository(registeredClient);
+	}
+
+	@Bean
+	public OAuth2AuthorizationService authorizationService() {
+		return new InMemoryOAuth2AuthorizationService();
+	}
+
+	@Bean
+	public AuthorizationServerSettings authorizationServerSettings() {
+		return AuthorizationServerSettings.builder().build();
+	}
+
+	@Bean
+	public JWKSource<SecurityContext> jwkSource() {
+		RSAKey rsaKey = Jwks.generateRsa();
+		JWKSet jwkSet = new JWKSet(rsaKey);
+		return (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);
+	}
+
+	@Bean
+	public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
+		return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
+	}
+}
diff --git a/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app12/HelloController.java b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app12/HelloController.java
new file mode 100644
index 000000000..74e1ca709
--- /dev/null
+++ b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app12/HelloController.java
@@ -0,0 +1,17 @@
+package test.org.springdoc.api.app12;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/*
+ * @author yuta.saito
+ */
+@RestController
+@RequestMapping("/api")
+public class HelloController {
+	@GetMapping("/hello")
+	public String hello() {
+		return "Hello";
+	}
+}
diff --git a/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app12/Jwks.java b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app12/Jwks.java
new file mode 100644
index 000000000..2df2f0a1c
--- /dev/null
+++ b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app12/Jwks.java
@@ -0,0 +1,29 @@
+package test.org.springdoc.api.app12;
+
+
+import java.security.KeyPair;
+import java.security.interfaces.RSAPrivateKey;
+import java.security.interfaces.RSAPublicKey;
+import java.util.UUID;
+
+import com.nimbusds.jose.jwk.RSAKey;
+
+
+/**
+ * @author yuta.saito
+ */
+public final class Jwks {
+	private Jwks() {
+		//final class constructor should be hidden
+	}
+
+	public static RSAKey generateRsa() {
+		KeyPair keyPair = KeyGeneratorUtils.generateRsaKey();
+		RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
+		RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
+		return new RSAKey.Builder(publicKey)
+				.privateKey(privateKey)
+				.keyID(UUID.randomUUID().toString())
+				.build();
+	}
+}
diff --git a/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app12/KeyGeneratorUtils.java b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app12/KeyGeneratorUtils.java
new file mode 100644
index 000000000..46efd9d2e
--- /dev/null
+++ b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app12/KeyGeneratorUtils.java
@@ -0,0 +1,26 @@
+package test.org.springdoc.api.app12;
+
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+
+/**
+ * @author yuta.saito
+ */
+public final class KeyGeneratorUtils {
+	private KeyGeneratorUtils() {
+		//final class constructor should be hidden
+	}
+
+	static KeyPair generateRsaKey() {
+		KeyPair keyPair;
+		try {
+			KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
+			keyPairGenerator.initialize(2048);
+			keyPair = keyPairGenerator.generateKeyPair();
+		}
+		catch (Exception ex) {
+			throw new IllegalStateException(ex);
+		}
+		return keyPair;
+	}
+}
diff --git a/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app12/SpringDocApp12Test.java b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app12/SpringDocApp12Test.java
new file mode 100644
index 000000000..4bfb122eb
--- /dev/null
+++ b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/java/test/org/springdoc/api/app12/SpringDocApp12Test.java
@@ -0,0 +1,56 @@
+/*
+ *
+ *  * Copyright 2019-2023 the original author or authors.
+ *  *
+ *  * Licensed under the Apache License, Version 2.0 (the "License");
+ *  * you may not use this file except in compliance with the License.
+ *  * You may obtain a copy of the License at
+ *  *
+ *  *      https://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing, software
+ *  * distributed under the License is distributed on an "AS IS" BASIS,
+ *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  * See the License for the specific language governing permissions and
+ *  * limitations under the License.
+ *
+ */
+
+package test.org.springdoc.api.app12;
+
+import java.util.Optional;
+
+import io.swagger.v3.core.converter.ModelConverter;
+import io.swagger.v3.core.converter.ModelConverters;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.springdoc.core.converters.SchemaPropertyDeprecatingConverter;
+import test.org.springdoc.api.AbstractSpringDocTest;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.test.context.TestPropertySource;
+
+@TestPropertySource(properties = { "springdoc.show-oauth2-endpoints=true", "springdoc.model-converters.deprecating-converter.enabled=false" })
+public class SpringDocApp12Test extends AbstractSpringDocTest {
+
+	@BeforeAll
+	public static void init() {
+		Optional<ModelConverter> deprecatingConverterOptional =
+				ModelConverters.getInstance().getConverters()
+						.stream().filter(modelConverter -> modelConverter instanceof SchemaPropertyDeprecatingConverter).findAny();
+		deprecatingConverterOptional.ifPresent(ModelConverters.getInstance()::removeConverter);
+	}
+
+	@AfterAll
+	public static void clean() {
+		Optional<ModelConverter> deprecatingConverterOptional =
+				ModelConverters.getInstance().getConverters()
+						.stream().filter(modelConverter -> modelConverter instanceof SchemaPropertyDeprecatingConverter).findAny();
+		deprecatingConverterOptional.ifPresent(ModelConverters.getInstance()::addConverter);
+	}
+
+	@SpringBootApplication
+	static class SpringDocTestApp {
+	}
+
+}
diff --git a/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/resources/results/app11.json b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/resources/results/app11.json
new file mode 100644
index 000000000..1f8119986
--- /dev/null
+++ b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/resources/results/app11.json
@@ -0,0 +1,605 @@
+{
+  "openapi": "3.0.1",
+  "info": {
+    "title": "OpenAPI definition",
+    "version": "v0"
+  },
+  "servers": [
+    {
+      "url": "http://localhost",
+      "description": "Generated server url"
+    }
+  ],
+  "paths": {
+    "/api/hello": {
+      "get": {
+        "tags": [
+          "hello-controller"
+        ],
+        "operationId": "hello",
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "*/*": {
+                "schema": {
+                  "type": "string"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/oauth2/jwks": {
+      "get": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "object",
+                  "properties": {
+                    "keys": {
+                      "type": "array",
+                      "items": {
+                        "type": "object",
+                        "additionalProperties": true
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Bad Request",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Error"
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    },
+    "/.well-known/oauth-authorization-server": {
+      "get": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2AuthorizationServerMetadata"
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    },
+    "/oauth2/token": {
+      "post": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "parameters": [
+          {
+            "in": "header",
+            "name": "Authorization"
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/x-www-form-urlencoded": {
+              "schema": {
+                "type": "object",
+                "properties": {
+                  "grant_type": {
+                    "type": "string",
+                    "enum": [
+                      "authorization_code",
+                      "refresh_token",
+                      "client_credentials"
+                    ]
+                  },
+                  "code": {
+                    "type": "string"
+                  },
+                  "redirect_uri": {
+                    "type": "string"
+                  },
+                  "refresh_token": {
+                    "type": "string"
+                  },
+                  "scope": {
+                    "type": "string"
+                  },
+                  "client_id": {
+                    "type": "string"
+                  },
+                  "client_secret": {
+                    "type": "string"
+                  },
+                  "client_assertion_type": {
+                    "type": "string"
+                  },
+                  "client_assertion": {
+                    "type": "string"
+                  },
+                  "additionalParameters": {
+                    "type": "object",
+                    "additionalProperties": {
+                      "type": "string"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Token"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Bad Request",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Error"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Unauthorized",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Error"
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    },
+    "/oauth2/authorize": {
+      "post": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "parameters": [
+          {
+            "name": "parameters",
+            "in": "query",
+            "schema": {
+              "type": "object",
+              "additionalProperties": {
+                "type": "string"
+              }
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "text/html": {}
+            }
+          },
+          "302": {
+            "description": "Moved Temporarily",
+            "headers": {
+              "Location": {
+                "schema": {
+                  "type": "string"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Bad Request",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Error"
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    },
+    "/oauth2/introspect": {
+      "post": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "requestBody": {
+          "content": {
+            "application/x-www-form-urlencoded": {
+              "schema": {
+                "type": "object",
+                "properties": {
+                  "token": {
+                    "type": "string"
+                  },
+                  "token_type_hint": {
+                    "type": "string"
+                  },
+                  "additionalParameters": {
+                    "type": "object",
+                    "additionalProperties": {
+                      "type": "string"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2TokenIntrospection"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Bad Request",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Error"
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    },
+    "/oauth2/revoke": {
+      "post": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "requestBody": {
+          "content": {
+            "application/x-www-form-urlencoded": {
+              "schema": {
+                "type": "object",
+                "properties": {
+                  "token": {
+                    "type": "string"
+                  },
+                  "token_type_hint": {
+                    "type": "string"
+                  }
+                }
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "OK"
+          },
+          "400": {
+            "description": "Bad Request",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Error"
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    },
+    "/.well-known/openid-configuration": {
+      "get": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OidcProviderConfiguration"
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    },
+    "/userinfo": {
+      "get": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "object",
+                  "additionalProperties": {
+                    "type": "string"
+                  }
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    }
+  },
+  "components": {
+    "schemas": {
+      "OAuth2Error": {
+        "type": "object",
+        "properties": {
+          "errorCode": {
+            "type": "string"
+          },
+          "description": {
+            "type": "string"
+          },
+          "uri": {
+            "type": "string"
+          }
+        }
+      },
+      "OAuth2AuthorizationServerMetadata": {
+        "type": "object",
+        "properties": {
+          "issuer": {
+            "type": "string"
+          },
+          "token_endpoint_auth_methods_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "revocation_endpoint_auth_methods_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "introspection_endpoint_auth_methods_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "code_challenge_methods_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "authorization_endpoint": {
+            "type": "string"
+          },
+          "token_endpoint": {
+            "type": "string"
+          },
+          "response_types_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "grant_types_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "revocation_endpoint": {
+            "type": "string"
+          },
+          "introspection_endpoint": {
+            "type": "string"
+          },
+          "jwks_uri": {
+            "type": "string"
+          }
+        }
+      },
+      "OAuth2Token": {
+        "type": "object",
+        "properties": {
+          "scope": {
+            "type": "string"
+          },
+          "expires_in": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "access_token": {
+            "type": "string"
+          },
+          "refresh_token": {
+            "type": "string"
+          },
+          "token_type": {
+            "type": "string"
+          }
+        }
+      },
+      "OAuth2TokenIntrospection": {
+        "type": "object",
+        "properties": {
+          "nbf": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "scope": {
+            "type": "string"
+          },
+          "jti": {
+            "type": "string"
+          },
+          "client_id": {
+            "type": "string"
+          },
+          "username": {
+            "type": "string"
+          },
+          "active": {
+            "type": "boolean"
+          },
+          "iss": {
+            "type": "string"
+          },
+          "aud": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "token_type": {
+            "type": "string"
+          },
+          "exp": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "sub": {
+            "type": "string"
+          },
+          "iat": {
+            "type": "integer",
+            "format": "int64"
+          }
+        }
+      },
+      "OidcProviderConfiguration": {
+        "type": "object",
+        "properties": {
+          "token_endpoint_auth_methods_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "revocation_endpoint_auth_methods_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "introspection_endpoint_auth_methods_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "code_challenge_methods_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "id_token_signing_alg_values_supported": {
+            "type": "string"
+          },
+          "authorization_endpoint": {
+            "type": "string"
+          },
+          "token_endpoint": {
+            "type": "string"
+          },
+          "userinfo_endpoint": {
+            "type": "string"
+          },
+          "subject_types_supported": {
+            "type": "string"
+          },
+          "scopes_supported": {
+            "type": "string"
+          },
+          "response_types_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "grant_types_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "revocation_endpoint": {
+            "type": "string"
+          },
+          "introspection_endpoint": {
+            "type": "string"
+          },
+          "issuer": {
+            "type": "string"
+          },
+          "jwks_uri": {
+            "type": "string"
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/resources/results/app12.json b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/resources/results/app12.json
new file mode 100644
index 000000000..8925e7038
--- /dev/null
+++ b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/resources/results/app12.json
@@ -0,0 +1,788 @@
+{
+  "openapi": "3.0.1",
+  "info": {
+    "title": "OpenAPI definition",
+    "version": "v0"
+  },
+  "servers": [
+    {
+      "url": "http://localhost",
+      "description": "Generated server url"
+    }
+  ],
+  "paths": {
+    "/api/hello": {
+      "get": {
+        "tags": [
+          "hello-controller"
+        ],
+        "operationId": "hello",
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "*/*": {
+                "schema": {
+                  "type": "string"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/oauth2/jwks": {
+      "get": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "object",
+                  "properties": {
+                    "keys": {
+                      "type": "array",
+                      "items": {
+                        "type": "object",
+                        "additionalProperties": true
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Bad Request",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Error"
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    },
+    "/.well-known/oauth-authorization-server": {
+      "get": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2AuthorizationServerMetadata"
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    },
+    "/oauth2/token": {
+      "post": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "parameters": [
+          {
+            "in": "header",
+            "name": "Authorization"
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/x-www-form-urlencoded": {
+              "schema": {
+                "type": "object",
+                "properties": {
+                  "grant_type": {
+                    "type": "string",
+                    "enum": [
+                      "authorization_code",
+                      "refresh_token",
+                      "client_credentials"
+                    ]
+                  },
+                  "code": {
+                    "type": "string"
+                  },
+                  "redirect_uri": {
+                    "type": "string"
+                  },
+                  "refresh_token": {
+                    "type": "string"
+                  },
+                  "scope": {
+                    "type": "string"
+                  },
+                  "client_id": {
+                    "type": "string"
+                  },
+                  "client_secret": {
+                    "type": "string"
+                  },
+                  "client_assertion_type": {
+                    "type": "string"
+                  },
+                  "client_assertion": {
+                    "type": "string"
+                  },
+                  "additionalParameters": {
+                    "type": "object",
+                    "additionalProperties": {
+                      "type": "string"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Token"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Bad Request",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Error"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Unauthorized",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Error"
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    },
+    "/oauth2/authorize": {
+      "post": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "parameters": [
+          {
+            "name": "parameters",
+            "in": "query",
+            "schema": {
+              "type": "object",
+              "additionalProperties": {
+                "type": "string"
+              }
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "text/html": {}
+            }
+          },
+          "302": {
+            "description": "Moved Temporarily",
+            "headers": {
+              "Location": {
+                "schema": {
+                  "type": "string"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Bad Request",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Error"
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    },
+    "/oauth2/introspect": {
+      "post": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "requestBody": {
+          "content": {
+            "application/x-www-form-urlencoded": {
+              "schema": {
+                "type": "object",
+                "properties": {
+                  "token": {
+                    "type": "string"
+                  },
+                  "token_type_hint": {
+                    "type": "string"
+                  },
+                  "additionalParameters": {
+                    "type": "object",
+                    "additionalProperties": {
+                      "type": "string"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2TokenIntrospection"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Bad Request",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Error"
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    },
+    "/oauth2/revoke": {
+      "post": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "requestBody": {
+          "content": {
+            "application/x-www-form-urlencoded": {
+              "schema": {
+                "type": "object",
+                "properties": {
+                  "token": {
+                    "type": "string"
+                  },
+                  "token_type_hint": {
+                    "type": "string"
+                  }
+                }
+              }
+            }
+          }
+        },
+        "responses": {
+          "200": {
+            "description": "OK"
+          },
+          "400": {
+            "description": "Bad Request",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Error"
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    },
+    "/.well-known/openid-configuration": {
+      "get": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OidcProviderConfiguration"
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    },
+    "/userinfo": {
+      "get": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "object",
+                  "additionalProperties": {
+                    "type": "string"
+                  }
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    },
+    "/connect/register": {
+      "post": {
+        "tags": [
+          "authorization-server-endpoints"
+        ],
+        "parameters": [
+          {
+            "name": "Authorization",
+            "in": "header"
+          }
+        ],
+        "requestBody": {
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/ClientRegistrationRequest"
+              }
+            }
+          }
+        },
+        "responses": {
+          "201": {
+            "description": "Created",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ClientRegistrationResponse"
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Bad Request",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Error"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Unauthorized",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Error"
+                }
+              }
+            }
+          },
+          "403": {
+            "description": "Forbidden",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/OAuth2Error"
+                }
+              }
+            }
+          },
+          "500": {
+            "description": "Internal Server Error"
+          }
+        }
+      }
+    }
+  },
+  "components": {
+    "schemas": {
+      "OAuth2Error": {
+        "type": "object",
+        "properties": {
+          "errorCode": {
+            "type": "string"
+          },
+          "description": {
+            "type": "string"
+          },
+          "uri": {
+            "type": "string"
+          }
+        }
+      },
+      "OAuth2AuthorizationServerMetadata": {
+        "type": "object",
+        "properties": {
+          "issuer": {
+            "type": "string"
+          },
+          "token_endpoint_auth_methods_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "revocation_endpoint_auth_methods_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "introspection_endpoint_auth_methods_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "code_challenge_methods_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "authorization_endpoint": {
+            "type": "string"
+          },
+          "token_endpoint": {
+            "type": "string"
+          },
+          "response_types_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "grant_types_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "revocation_endpoint": {
+            "type": "string"
+          },
+          "introspection_endpoint": {
+            "type": "string"
+          },
+          "jwks_uri": {
+            "type": "string"
+          }
+        }
+      },
+      "OAuth2Token": {
+        "type": "object",
+        "properties": {
+          "scope": {
+            "type": "string"
+          },
+          "expires_in": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "access_token": {
+            "type": "string"
+          },
+          "refresh_token": {
+            "type": "string"
+          },
+          "token_type": {
+            "type": "string"
+          }
+        }
+      },
+      "OAuth2TokenIntrospection": {
+        "type": "object",
+        "properties": {
+          "nbf": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "scope": {
+            "type": "string"
+          },
+          "jti": {
+            "type": "string"
+          },
+          "client_id": {
+            "type": "string"
+          },
+          "username": {
+            "type": "string"
+          },
+          "active": {
+            "type": "boolean"
+          },
+          "iss": {
+            "type": "string"
+          },
+          "aud": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "token_type": {
+            "type": "string"
+          },
+          "exp": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "sub": {
+            "type": "string"
+          },
+          "iat": {
+            "type": "integer",
+            "format": "int64"
+          }
+        }
+      },
+      "OidcProviderConfiguration": {
+        "type": "object",
+        "properties": {
+          "token_endpoint_auth_methods_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "revocation_endpoint_auth_methods_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "introspection_endpoint_auth_methods_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "code_challenge_methods_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "id_token_signing_alg_values_supported": {
+            "type": "string"
+          },
+          "authorization_endpoint": {
+            "type": "string"
+          },
+          "token_endpoint": {
+            "type": "string"
+          },
+          "userinfo_endpoint": {
+            "type": "string"
+          },
+          "subject_types_supported": {
+            "type": "string"
+          },
+          "scopes_supported": {
+            "type": "string"
+          },
+          "response_types_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "grant_types_supported": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "revocation_endpoint": {
+            "type": "string"
+          },
+          "introspection_endpoint": {
+            "type": "string"
+          },
+          "issuer": {
+            "type": "string"
+          },
+          "jwks_uri": {
+            "type": "string"
+          }
+        }
+      },
+      "ClientRegistrationResponse": {
+        "type": "object",
+        "properties": {
+          "token_endpoint_auth_method": {
+            "type": "string"
+          },
+          "id_token_signed_response_alg": {
+            "type": "string"
+          },
+          "response_types": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "client_secret": {
+            "type": "string"
+          },
+          "client_secret_expires_at": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "registration_access_token": {
+            "type": "string"
+          },
+          "registration_client_uri": {
+            "type": "string"
+          },
+          "client_id_issued_at": {
+            "type": "integer",
+            "format": "int64"
+          },
+          "redirect_uris": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "scope": {
+            "type": "string"
+          },
+          "client_id": {
+            "type": "string"
+          },
+          "token_endpoint_auth_signing_alg": {
+            "type": "string"
+          },
+          "grant_types": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "jwks_uri": {
+            "type": "string"
+          },
+          "client_name": {
+            "type": "string"
+          }
+        }
+      },
+      "ClientRegistrationRequest": {
+        "type": "object",
+        "properties": {
+          "token_endpoint_auth_method": {
+            "type": "string"
+          },
+          "id_token_signed_response_alg": {
+            "type": "string"
+          },
+          "response_types": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "client_secret": {
+            "type": "string"
+          },
+          "client_secret_expires_at": {
+            "type": "string",
+            "format": "date-time"
+          },
+          "client_id_issued_at": {
+            "type": "string",
+            "format": "date-time"
+          },
+          "redirect_uris": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "scope": {
+            "type": "string"
+          },
+          "client_id": {
+            "type": "string"
+          },
+          "token_endpoint_auth_signing_alg": {
+            "type": "string"
+          },
+          "grant_types": {
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "jwks_uri": {
+            "type": "string"
+          },
+          "client_name": {
+            "type": "string"
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/resources/results/app5.json b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/resources/results/app5.json
index 50d96838a..447cc3198 100644
--- a/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/resources/results/app5.json
+++ b/springdoc-openapi-tests/springdoc-openapi-security-tests/src/test/resources/results/app5.json
@@ -16,10 +16,11 @@
         "tags": [
           "hello-controller"
         ],
-        "operationId": "doGet_1",
+        "operationId": "doGet",
         "responses": {
           "200": {
-            "description": "OK"
+            "description": "OK",
+            "content": {}
           }
         }
       },
@@ -27,7 +28,7 @@
         "tags": [
           "hello-controller"
         ],
-        "operationId": "doPost_1",
+        "operationId": "doPost",
         "responses": {
           "200": {
             "description": "OK",
@@ -56,4 +57,3 @@
     }
   }
 }
- 
\ No newline at end of file