Repository: springdoc/springdoc-openapi
Pull request #299 (2019-12-26 13:20:19)

Fix autoconfigurations
Fix autoconfigurations to be not loaded if classpath does not contain mvc/reactive dependencies or application is not web application.

Also had to move 2 beans from `SpringDocConfiguration` to `SpringDocWebMvcConfiguration` and `SpringDocWebFluxConfiguration`, as `SpringDocWebMvcConfiguration`/`SpringDocWebFluxConfiguration` could not be disabled, they had circular reference, so it was not possible to disable any of the configuration as it caused issues with bean creation.


Patch:
diff --git a/.travis.yml b/.travis.yml
index 7c52560ac..5d48ab278 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -8,16 +8,15 @@ cache:
 
 addons:
   sonarcloud:
-    organization: "springdoc-openapi"
-    token:
-      secure: "S5zeA+Vvbe7LG450OAtd5TrBRL8fhaWgJjzAp3RzS797++2xrN92jI74h5NL0MiYBd6NKoWql1WJaMKHCfo/EJ6RdExdw71126B2k061iK54y8pxom+ADFigKgkVzHgnV28uBioC2DIcVvRDk8WkX6IZ9I6C72TzWapXrlCnRkSY1lsfOwvqahTYheaDzRKWN5WoBm8M63IiciMz21SSrdm20fjQeY90EI0EfKn0jjJWL8WKmDa98MeSsJWBwR964ICKRvRq9CGTjTZVhL+D0VYt4tS7kpoN9QatL6SL/octL6jXhgGqnFu8AWRwe1RX7hM9jjDLCkXrz6pr9+t4ts8lo7CcG1YmO5A0vRZYvdO9Y98REEAfU17Y21YjWwl2H41BuHGjJ/vSyVQ1ASE4Q7hBdCTJYNVr+PtMIHR6WFuNIBgA23sYvEQhBolnLpVfs3q5CjVwV3r6wx0ubaRkLlv0MTphic/lGQPFfaVdjYpBCKAr+G6k7t8elpMCf1oeVoopGM6y1WRSCmq2nZyf1n9oNXd4BcFvwnaQwQaEAPnTcZw1F4O6Z0Tc5BJOvJ5pQ79d3EJaOGyDJmezKBxV6mgeIH1ILkWc6nKf1JnqE4v8yCdRsvsTAPcIEn66jqTLpo5uvERroodHqNKP9aSbxvyHp8nkSLb35+w8NpRMlEg="
-      
+    organization: "springdoc"
+
 script:
   - mvn clean package --settings settings.xml
+  - mvn sonar:sonar -Dsonar.login=$SONAR_TOKEN -DskipTests
 
 deploy:
   provider: script
-  script: mvn deploy -DskipTests sonar:sonar -Dsonar.projectKey=springdoc_springdoc-openapi --settings settings.xml
+  script: mvn clean deploy -DskipTests --settings settings.xml
   on:
     branch: master
   
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4c439bd29..a13110af0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,9 @@ 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).
 
+## [1.2.22] -
+- Fix autoconfigurations to be not loaded if classpath does not contain mvc/reactive dependencies or application is not web application
+  
 ## [1.2.21] - 
 ### Added
 - Springdoc, Callable support #297
@@ -408,7 +411,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ## [1.0.1] - 2019-07-24
 ### Added
-- Added demo applications, sample code
+- Added sample codes
 
 ## [1.0.0] - 2019-07-23
 ### Added
diff --git a/README.md b/README.md
index 8615201b4..0f31135fe 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
 [![Build Status](https://travis-ci.org/springdoc/springdoc-openapi.svg?branch=master)](https://travis-ci.org/springdoc/springdoc-openapi)
-[![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=springdoc_springdoc-openapi&metric=alert_status)](https://sonarcloud.io/dashboard?id=springdoc_springdoc-openapi)
+[![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=org.springdoc%3Aspringdoc-openapi&metric=alert_status)](https://sonarcloud.io/dashboard?id=org.springdoc%3Aspringdoc-openapi)
 
 ![Octocat](https://springdoc.github.io/springdoc-openapi-demos/images/springdoc-openapi.png)
 
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/api/AbstractOpenApiResource.java b/springdoc-openapi-common/src/main/java/org/springdoc/api/AbstractOpenApiResource.java
index 87e61a7b6..ee0c2cb51 100644
--- a/springdoc-openapi-common/src/main/java/org/springdoc/api/AbstractOpenApiResource.java
+++ b/springdoc-openapi-common/src/main/java/org/springdoc/api/AbstractOpenApiResource.java
@@ -9,7 +9,6 @@ import io.swagger.v3.oas.models.responses.ApiResponses;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springdoc.core.*;
-import org.springdoc.core.customizers.OpenApiCustomiser;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.annotation.AnnotationUtils;
 import org.springframework.util.AntPathMatcher;
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/OpenApiCustomiser.java b/springdoc-openapi-common/src/main/java/org/springdoc/api/OpenApiCustomiser.java
similarity index 74%
rename from springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/OpenApiCustomiser.java
rename to springdoc-openapi-common/src/main/java/org/springdoc/api/OpenApiCustomiser.java
index 906a7ac31..4fa767de5 100644
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/OpenApiCustomiser.java
+++ b/springdoc-openapi-common/src/main/java/org/springdoc/api/OpenApiCustomiser.java
@@ -1,4 +1,4 @@
-package org.springdoc.core.customizers;
+package org.springdoc.api;
 
 import io.swagger.v3.oas.models.OpenAPI;
 
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/AbstractRequestBuilder.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/AbstractRequestBuilder.java
index 6fd754a47..cacfc62b8 100644
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/AbstractRequestBuilder.java
+++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/AbstractRequestBuilder.java
@@ -8,8 +8,6 @@ import io.swagger.v3.oas.models.media.Schema;
 import io.swagger.v3.oas.models.parameters.Parameter;
 import org.apache.commons.lang3.StringUtils;
 import org.springdoc.core.RequestInfo.ParameterType;
-import org.springdoc.core.customizers.OperationCustomizer;
-import org.springdoc.core.customizers.ParameterCustomizer;
 import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
 import org.springframework.core.annotation.AnnotatedElementUtils;
 import org.springframework.core.annotation.AnnotationUtils;
@@ -67,18 +65,13 @@ public abstract class AbstractRequestBuilder {
     private final AbstractParameterBuilder parameterBuilder;
     private final RequestBodyBuilder requestBodyBuilder;
     private final OperationBuilder operationBuilder;
-    private final Optional<List<OperationCustomizer>> operationCustomizers;
-    private final Optional<List<ParameterCustomizer>> parameterCustomizers;
 
     protected AbstractRequestBuilder(AbstractParameterBuilder parameterBuilder, RequestBodyBuilder requestBodyBuilder,
-                                     OperationBuilder operationBuilder, Optional<List<OperationCustomizer>> operationCustomizers,
-                                     Optional<List<ParameterCustomizer>> parameterCustomizers) {
+                                     OperationBuilder operationBuilder) {
         super();
         this.parameterBuilder = parameterBuilder;
         this.requestBodyBuilder = requestBodyBuilder;
         this.operationBuilder = operationBuilder;
-        this.operationCustomizers = operationCustomizers;
-        this.parameterCustomizers = parameterCustomizers;
     }
 
 
@@ -163,21 +156,13 @@ public abstract class AbstractRequestBuilder {
         return operation;
     }
 
-    protected Operation customiseOperation(Operation operation, HandlerMethod handlerMethod) {
-        operationCustomizers.ifPresent(parameterCustomizers ->  parameterCustomizers.forEach( customizer -> customizer.customize(operation, handlerMethod)));
-        return operation;
-    }
-
-    protected Parameter customiseParameter(Parameter parameter, ParameterInfo parameterInfo, HandlerMethod handlerMethod) {
-        parameterCustomizers.ifPresent(parameterCustomizers ->  parameterCustomizers.forEach( customizer -> customizer.customize(parameter, parameterInfo.getParameter(), handlerMethod)));
-        return parameter;
-    }
+    protected abstract Operation customiseOperation(Operation operation, HandlerMethod handlerMethod);
 
     protected boolean isParamToIgnore(java.lang.reflect.Parameter parameter) {
         if (parameter.isAnnotationPresent(PathVariable.class)) {
             return false;
         }
-        return parameterBuilder.isAnnotationToIgnore(parameter) || PARAM_TYPES_TO_IGNORE.contains(parameter.getType()) || (AnnotationUtils.findAnnotation(parameter.getType(), Hidden.class) != null);
+        return parameterBuilder.isAnnotationToIgnore(parameter)  || PARAM_TYPES_TO_IGNORE.contains(parameter.getType()) || (AnnotationUtils.findAnnotation(parameter.getType(), Hidden.class) != null);
     }
 
     private void setParams(Operation operation, List<Parameter> operationParameters, RequestBodyInfo requestBodyInfo) {
@@ -229,8 +214,6 @@ public abstract class AbstractRequestBuilder {
         if (RequestMethod.GET.equals(requestMethod)) {
             parameter = this.buildParam(QUERY_PARAM, components, parameterInfo, Boolean.TRUE, null, jsonView);
         }
-
-        parameter = customiseParameter(parameter, parameterInfo, handlerMethod);
         return parameter;
     }
 
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/GroupedOpenApi.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/GroupedOpenApi.java
index 286c6909f..3d22c5740 100644
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/GroupedOpenApi.java
+++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/GroupedOpenApi.java
@@ -1,6 +1,6 @@
 package org.springdoc.core;
 
-import org.springdoc.core.customizers.OpenApiCustomiser;
+import org.springdoc.api.OpenApiCustomiser;
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/SpringDocConfiguration.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/SpringDocConfiguration.java
index 086c9a227..f7b0a4226 100644
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/SpringDocConfiguration.java
+++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/SpringDocConfiguration.java
@@ -3,8 +3,6 @@ package org.springdoc.core;
 import io.swagger.v3.core.converter.ModelConverter;
 import io.swagger.v3.oas.models.OpenAPI;
 import org.springdoc.core.converters.ObjectNodeConverter;
-import org.springdoc.core.converters.PropertyCustomizingConverter;
-import org.springdoc.core.customizers.PropertyCustomizer;
 import org.springframework.beans.factory.config.ConfigurableBeanFactory;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.ApplicationContext;
@@ -31,11 +29,6 @@ public class SpringDocConfiguration {
         return new ObjectNodeConverter();
     }
 
-    @Bean
-    PropertyCustomizingConverter propertyCustomizingConverter(Optional<List<PropertyCustomizer>> customizers){
-        return new PropertyCustomizingConverter(customizers);
-    }
-
     @Bean
     IgnoredParameterAnnotationsDefault ignoredParameterAnnotationsDefault() {
         return new IgnoredParameterAnnotationsDefault();
@@ -46,23 +39,11 @@ public class SpringDocConfiguration {
         return new OpenAPIBuilder(openAPI, context, securityParser,modelConverters);
     }
 
-    @Bean
-    public OperationBuilder operationBuilder(AbstractParameterBuilder parameterBuilder, RequestBodyBuilder requestBodyBuilder,
-                                             SecurityParser securityParser, OpenAPIBuilder openAPIBuilder, PropertyResolverUtils propertyResolverUtils) {
-        return new OperationBuilder(parameterBuilder, requestBodyBuilder,
-                securityParser, openAPIBuilder, propertyResolverUtils);
-    }
-
     @Bean
     public PropertyResolverUtils propertyResolverUtils(ConfigurableBeanFactory factory) {
         return new PropertyResolverUtils(factory);
     }
 
-    @Bean
-    public RequestBodyBuilder requestBodyBuilder(AbstractParameterBuilder parameterBuilder) {
-        return new RequestBodyBuilder(parameterBuilder);
-    }
-
     @Bean
     public SecurityParser securityParser(PropertyResolverUtils propertyResolverUtils) {
         return new SecurityParser(propertyResolverUtils);
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/SwaggerUiConfigProperties.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/SwaggerUiConfigProperties.java
index 84639d8c6..aeb854487 100644
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/SwaggerUiConfigProperties.java
+++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/SwaggerUiConfigProperties.java
@@ -8,7 +8,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.util.CollectionUtils;
 
-import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -117,11 +116,6 @@ public class SwaggerUiConfigProperties {
         swaggerUrls.add(swaggerUrl);
     }
 
-    public static void addGroup(String group, String url) {
-        SwaggerUrl swaggerUrl = new SwaggerUrl(group, url);
-        swaggerUrls.add(swaggerUrl);
-    }
-
     public static List<SwaggerUrl> getSwaggerUrls() {
         return swaggerUrls;
     }
@@ -131,18 +125,14 @@ public class SwaggerUiConfigProperties {
     }
 
     public static void addUrl(String url) {
-        swaggerUrls.forEach(elt ->
-        {
-            if (StringUtils.isEmpty(elt.url))
-                elt.setUrl(url + DEFAULT_PATH_SEPARATOR + elt.getName());
-        });
+        swaggerUrls.forEach(elt -> elt.setUrl(url + DEFAULT_PATH_SEPARATOR + elt.getName()));
     }
 
     public Map<String, Object> getConfigParameters() {
         final Map<String, Object> params = new TreeMap<>();
         put("layout", layout, params);
         put(CONFIG_URL_PROPERTY, configUrl, params);
-        put("validatorUrl", validatorUrl, params);
+        put( "validatorUrl", validatorUrl, params);
         put("filter", filter, params);
         put("deepLinking", this.deepLinking, params);
         put("displayOperationId", displayOperationId, params);
@@ -353,11 +343,6 @@ public class SwaggerUiConfigProperties {
         private String url;
         private String name;
 
-        public SwaggerUrl(String group, String url) {
-            this.url = url;
-            this.name = group;
-        }
-
         public SwaggerUrl(String group) {
             this.name = group;
         }
@@ -378,13 +363,4 @@ public class SwaggerUiConfigProperties {
             this.name = name;
         }
     }
-
-    public boolean isValidUrl(String url) {
-        try {
-            new URL(url).toURI();
-            return true;
-        } catch (Exception e) {
-            return false;
-        }
-    }
 }
\ No newline at end of file
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/converters/PropertyCustomizingConverter.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/converters/PropertyCustomizingConverter.java
deleted file mode 100644
index 9a4bc40eb..000000000
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/converters/PropertyCustomizingConverter.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.springdoc.core.converters;
-
-import io.swagger.v3.core.converter.AnnotatedType;
-import io.swagger.v3.core.converter.ModelConverter;
-import io.swagger.v3.core.converter.ModelConverterContext;
-import io.swagger.v3.oas.models.media.Schema;
-import org.springdoc.core.customizers.PropertyCustomizer;
-import org.springframework.util.CollectionUtils;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Optional;
-
-public class PropertyCustomizingConverter implements ModelConverter {
-
-    private final Optional<List<PropertyCustomizer>> customizers;
-
-    public PropertyCustomizingConverter(Optional<List<PropertyCustomizer>> customizers) {
-        this.customizers = customizers;
-    }
-
-    @Override
-    public Schema resolve(AnnotatedType type, ModelConverterContext context, Iterator<ModelConverter> chain) {
-        if (chain.hasNext()) {
-            Schema<?> resolvedSchema = chain.next().resolve(type, context, chain);
-            if (type.isSchemaProperty()) {
-                customizers.ifPresent(customizers -> customizers.forEach(customizer -> customizer.customize(resolvedSchema, type)));
-            }
-            return resolvedSchema;
-        } else {
-            return null;
-        }
-    }
-}
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/OperationCustomizer.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/OperationCustomizer.java
deleted file mode 100644
index fe7e7b168..000000000
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/OperationCustomizer.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.springdoc.core.customizers;
-
-import io.swagger.v3.oas.models.Operation;
-import org.springframework.web.method.HandlerMethod;
-
-/**
- * Implement and register a bean of type {@link OperationCustomizer} to customize an operation
- * based on the handler method input
- */
-public interface OperationCustomizer {
-
-    /**
-     * @param operation     input operation
-     * @param handlerMethod original handler method
-     * @return customized operation
-     */
-    Operation customize(Operation operation, HandlerMethod handlerMethod);
-}
-
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/ParameterCustomizer.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/ParameterCustomizer.java
deleted file mode 100644
index 38e57c72e..000000000
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/ParameterCustomizer.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.springdoc.core.customizers;
-
-import io.swagger.v3.oas.models.parameters.Parameter;
-import org.springframework.web.method.HandlerMethod;
-
-/**
- * Implement and register a bean of type {@link ParameterCustomizer} to customize a parameter
- * based on the parameter and handler method input
- */
-public interface ParameterCustomizer {
-    /**
-     * @param parameterModel to be customized
-     * @param parameter original parameter from handler method
-     * @param handlerMethod handler method
-     * @return customized parameter
-     */
-    Parameter customize(Parameter parameterModel, java.lang.reflect.Parameter parameter, HandlerMethod handlerMethod);
-}
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/PropertyCustomizer.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/PropertyCustomizer.java
deleted file mode 100644
index 3cabadd78..000000000
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/PropertyCustomizer.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.springdoc.core.customizers;
-
-import io.swagger.v3.core.converter.AnnotatedType;
-import io.swagger.v3.oas.models.media.Schema;
-
-/**
- * Implement and register a bean of type {@link PropertyCustomizer} to customize a schema property
- * based on annotated type
- */
-public interface PropertyCustomizer {
-
-    /**
-     * @param property to be customized
-     * @param type     form the model class
-     * @return customized property
-     */
-    Schema<?> customize(Schema<?> property, AnnotatedType type);
-}
diff --git a/springdoc-openapi-data-rest/src/main/java/org/springdoc/core/converters/PageableAsQueryParam.java b/springdoc-openapi-data-rest/src/main/java/org/springdoc/core/converters/PageableAsQueryParam.java
deleted file mode 100644
index b7f319743..000000000
--- a/springdoc-openapi-data-rest/src/main/java/org/springdoc/core/converters/PageableAsQueryParam.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.springdoc.core.converters;
-
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.Parameters;
-import io.swagger.v3.oas.annotations.enums.ParameterIn;
-import io.swagger.v3.oas.annotations.media.ArraySchema;
-import io.swagger.v3.oas.annotations.media.Content;
-import io.swagger.v3.oas.annotations.media.Schema;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-@Parameters({
-        @Parameter(in = ParameterIn.QUERY
-                , description = "Zero-based page index (0..N)"
-                , name = "page"
-                , content = @Content(schema = @Schema(type = "integer", defaultValue = "0"))),
-        @Parameter(in = ParameterIn.QUERY
-                , description = "The size of the page to be returned"
-                , name = "size"
-                , content = @Content(schema = @Schema(type = "integer", defaultValue = "20"))),
-        @Parameter(in = ParameterIn.QUERY
-                , description = "Sorting criteria in the format: property(,asc|desc). "
-                + "Default sort order is ascending. " + "Multiple sort criteria are supported."
-                , name = "sort"
-                , content = @Content(array = @ArraySchema(schema = @Schema(type = "string"))))
-})
-public @interface PageableAsQueryParam {
-
-}
\ No newline at end of file
diff --git a/springdoc-openapi-kotlin/src/main/java/org/springdoc/core/KotlinCoroutinesRequestBuilder.java b/springdoc-openapi-kotlin/src/main/java/org/springdoc/core/KotlinCoroutinesRequestBuilder.java
index f4f3d4b6f..ffddb31a2 100644
--- a/springdoc-openapi-kotlin/src/main/java/org/springdoc/core/KotlinCoroutinesRequestBuilder.java
+++ b/springdoc-openapi-kotlin/src/main/java/org/springdoc/core/KotlinCoroutinesRequestBuilder.java
@@ -1,23 +1,24 @@
 package org.springdoc.core;
 
+import io.swagger.v3.oas.models.Operation;
 import kotlin.coroutines.Continuation;
-import org.springdoc.core.customizers.OperationCustomizer;
-import org.springdoc.core.customizers.ParameterCustomizer;
-
-import java.util.List;
-import java.util.Optional;
+import org.springframework.web.method.HandlerMethod;
 
 
 public class KotlinCoroutinesRequestBuilder extends AbstractRequestBuilder {
 
 
     public KotlinCoroutinesRequestBuilder(AbstractParameterBuilder parameterBuilder, RequestBodyBuilder requestBodyBuilder,
-                                          OperationBuilder operationBuilder, Optional<List<OperationCustomizer>> customizers,
-                                          Optional<List<ParameterCustomizer>> parameterCustomizers) {
-        super(parameterBuilder, requestBodyBuilder, operationBuilder, customizers, parameterCustomizers);
+                                          OperationBuilder operationBuilder) {
+        super(parameterBuilder, requestBodyBuilder, operationBuilder);
     }
 
     static {
         PARAM_TYPES_TO_IGNORE.add(Continuation.class);
     }
+
+    @Override
+    protected Operation customiseOperation(Operation operation, HandlerMethod handlerMethod) {
+        return operation;
+    }
 }
diff --git a/springdoc-openapi-kotlin/src/main/java/org/springdoc/core/SpringDocKotlinConfiguration.java b/springdoc-openapi-kotlin/src/main/java/org/springdoc/core/SpringDocKotlinConfiguration.java
index e0b988192..9f8a5c454 100644
--- a/springdoc-openapi-kotlin/src/main/java/org/springdoc/core/SpringDocKotlinConfiguration.java
+++ b/springdoc-openapi-kotlin/src/main/java/org/springdoc/core/SpringDocKotlinConfiguration.java
@@ -1,15 +1,10 @@
 package org.springdoc.core;
 
-import org.springdoc.core.customizers.OperationCustomizer;
-import org.springdoc.core.customizers.ParameterCustomizer;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Primary;
 
-import java.util.List;
-import java.util.Optional;
-
 import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
 
 @Configuration
@@ -19,9 +14,9 @@ public class SpringDocKotlinConfiguration {
     @Bean
     @Primary
     KotlinCoroutinesRequestBuilder kotlinCoroutinesRequestBuilder(AbstractParameterBuilder parameterBuilder, RequestBodyBuilder requestBodyBuilder,
-                                                                  OperationBuilder operationBuilder, Optional<List<OperationCustomizer>> operationCustomizers, Optional<List<ParameterCustomizer>> parameterCustomizers ) {
+                                                                  OperationBuilder operationBuilder) {
         return new KotlinCoroutinesRequestBuilder(parameterBuilder, requestBodyBuilder,
-                operationBuilder, operationCustomizers, parameterCustomizers);
+                operationBuilder);
     }
 
 
diff --git a/springdoc-openapi-ui/src/main/java/org/springdoc/ui/SwaggerConfig.java b/springdoc-openapi-ui/src/main/java/org/springdoc/ui/SwaggerConfig.java
index 3f08cf4af..da05cad73 100644
--- a/springdoc-openapi-ui/src/main/java/org/springdoc/ui/SwaggerConfig.java
+++ b/springdoc-openapi-ui/src/main/java/org/springdoc/ui/SwaggerConfig.java
@@ -35,7 +35,17 @@ public class SwaggerConfig extends WebMvcConfigurerAdapter { // NOSONAR
 
         String webJarsLocation = webJarsPrefixUrl + DEFAULT_PATH_SEPARATOR;
 
-        registry.addResourceHandler(uiRootPath + "/swagger-ui/**").addResourceLocations(webJarsLocation)
+        registry.addResourceHandler(uiRootPath + "/swagger-ui/swagger-ui.css").addResourceLocations(webJarsLocation)
+                .resourceChain(false);
+        registry.addResourceHandler(uiRootPath + "/swagger-ui/swagger-ui-standalone-preset.js").addResourceLocations(webJarsLocation)
+                .resourceChain(false);
+        registry.addResourceHandler(uiRootPath + "/swagger-ui/swagger-ui-bundle.js").addResourceLocations(webJarsLocation)
+                .resourceChain(false);
+        registry.addResourceHandler(uiRootPath + "/swagger-ui/index.html").addResourceLocations(webJarsLocation)
+                .resourceChain(false);
+        registry.addResourceHandler(uiRootPath + "/swagger-ui/favicon-32x32.png").addResourceLocations(webJarsLocation)
+                .resourceChain(false);
+        registry.addResourceHandler(uiRootPath + "/swagger-ui/favicon-16x16.png").addResourceLocations(webJarsLocation)
                 .resourceChain(false);
     }
 
diff --git a/springdoc-openapi-ui/src/main/java/org/springdoc/ui/SwaggerWelcome.java b/springdoc-openapi-ui/src/main/java/org/springdoc/ui/SwaggerWelcome.java
index f1f76b509..b7e8a716d 100644
--- a/springdoc-openapi-ui/src/main/java/org/springdoc/ui/SwaggerWelcome.java
+++ b/springdoc-openapi-ui/src/main/java/org/springdoc/ui/SwaggerWelcome.java
@@ -12,7 +12,6 @@ import org.springframework.http.MediaType;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
 import org.springframework.web.util.UriComponentsBuilder;
 
 import javax.servlet.http.HttpServletRequest;
@@ -86,8 +85,5 @@ class SwaggerWelcome {
                 SwaggerUiConfigProperties.addUrl(url);
 
         }
-        if(!swaggerUiConfig.isValidUrl(swaggerUiConfig.getOauth2RedirectUrl())){
-            swaggerUiConfig.setOauth2RedirectUrl(ServletUriComponentsBuilder.fromCurrentContextPath().path(swaggerUiConfig.getOauth2RedirectUrl()).build().toString());
-        }
     }
 }
\ No newline at end of file
diff --git a/springdoc-openapi-webflux-core/src/main/java/org/springdoc/api/OpenApiResource.java b/springdoc-openapi-webflux-core/src/main/java/org/springdoc/api/OpenApiResource.java
index 253e105a1..912d12234 100644
--- a/springdoc-openapi-webflux-core/src/main/java/org/springdoc/api/OpenApiResource.java
+++ b/springdoc-openapi-webflux-core/src/main/java/org/springdoc/api/OpenApiResource.java
@@ -10,7 +10,6 @@ import org.springdoc.core.AbstractRequestBuilder;
 import org.springdoc.core.AbstractResponseBuilder;
 import org.springdoc.core.OpenAPIBuilder;
 import org.springdoc.core.OperationBuilder;
-import org.springdoc.core.customizers.OpenApiCustomiser;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.MediaType;
 import org.springframework.http.server.reactive.ServerHttpRequest;
diff --git a/springdoc-openapi-webflux-core/src/main/java/org/springdoc/core/RequestBuilder.java b/springdoc-openapi-webflux-core/src/main/java/org/springdoc/core/RequestBuilder.java
index 188661712..93a77b20f 100644
--- a/springdoc-openapi-webflux-core/src/main/java/org/springdoc/core/RequestBuilder.java
+++ b/springdoc-openapi-webflux-core/src/main/java/org/springdoc/core/RequestBuilder.java
@@ -1,14 +1,11 @@
 package org.springdoc.core;
 
-import org.springdoc.core.customizers.OperationCustomizer;
-import org.springdoc.core.customizers.ParameterCustomizer;
+import io.swagger.v3.oas.models.Operation;
 import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.web.method.HandlerMethod;
 import org.springframework.web.server.ServerWebExchange;
 
-import java.util.List;
-import java.util.Optional;
-
 public class RequestBuilder extends AbstractRequestBuilder {
 
     static {
@@ -18,8 +15,12 @@ public class RequestBuilder extends AbstractRequestBuilder {
     }
 
     public RequestBuilder(AbstractParameterBuilder parameterBuilder, RequestBodyBuilder requestBodyBuilder,
-                          OperationBuilder operationBuilder, Optional<List<OperationCustomizer>> operationCustomizers,
-                          Optional<List<ParameterCustomizer>> parameterCustomizers) {
-        super(parameterBuilder, requestBodyBuilder, operationBuilder, operationCustomizers, parameterCustomizers);
+                          OperationBuilder operationBuilder) {
+        super(parameterBuilder, requestBodyBuilder, operationBuilder);
+    }
+
+    @Override
+    protected Operation customiseOperation(Operation operation, HandlerMethod handlerMethod) {
+        return operation;
     }
 }
diff --git a/springdoc-openapi-webflux-core/src/main/java/org/springdoc/core/SpringDocWebFluxConfiguration.java b/springdoc-openapi-webflux-core/src/main/java/org/springdoc/core/SpringDocWebFluxConfiguration.java
index 3be36e2cd..a7646d068 100644
--- a/springdoc-openapi-webflux-core/src/main/java/org/springdoc/core/SpringDocWebFluxConfiguration.java
+++ b/springdoc-openapi-webflux-core/src/main/java/org/springdoc/core/SpringDocWebFluxConfiguration.java
@@ -1,14 +1,15 @@
 package org.springdoc.core;
 
+import org.springdoc.api.OpenApiCustomiser;
 import org.springdoc.api.OpenApiResource;
-import org.springdoc.core.customizers.OpenApiCustomiser;
-import org.springdoc.core.customizers.OperationCustomizer;
-import org.springdoc.core.customizers.ParameterCustomizer;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
 import org.springframework.web.reactive.result.method.RequestMappingInfoHandlerMapping;
+import reactor.core.publisher.Mono;
 
 import java.util.List;
 import java.util.Optional;
@@ -16,6 +17,8 @@ import java.util.Optional;
 import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
 
 @Configuration
+@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
+@ConditionalOnClass(Mono.class)
 @ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
 public class SpringDocWebFluxConfiguration {
 
@@ -36,11 +39,23 @@ public class SpringDocWebFluxConfiguration {
         return new ParameterBuilder(localSpringDocParameterNameDiscoverer, ignoredParameterAnnotations);
     }
 
+    @Bean
+    public OperationBuilder operationBuilder(AbstractParameterBuilder parameterBuilder, RequestBodyBuilder requestBodyBuilder,
+                                             SecurityParser securityParser, OpenAPIBuilder openAPIBuilder, PropertyResolverUtils propertyResolverUtils) {
+        return new OperationBuilder(parameterBuilder, requestBodyBuilder,
+                securityParser, openAPIBuilder, propertyResolverUtils);
+    }
+
+    @Bean
+    public RequestBodyBuilder requestBodyBuilder(AbstractParameterBuilder parameterBuilder) {
+        return new RequestBodyBuilder(parameterBuilder);
+    }
+
     @Bean
     public RequestBuilder requestBuilder(AbstractParameterBuilder parameterBuilder, RequestBodyBuilder requestBodyBuilder,
-                                         OperationBuilder operationBuilder, Optional<List<OperationCustomizer>> operationCustomizers, Optional<List<ParameterCustomizer>> parameterCustomizers ) {
+                                         OperationBuilder operationBuilder) {
         return new RequestBuilder(parameterBuilder, requestBodyBuilder,
-                operationBuilder, operationCustomizers, parameterCustomizers);
+                operationBuilder);
     }
 
     @Bean
diff --git a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/OpenApiResource.java b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/OpenApiResource.java
index aeec55841..d097d908b 100644
--- a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/OpenApiResource.java
+++ b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/api/OpenApiResource.java
@@ -12,7 +12,6 @@ import org.springdoc.core.AbstractRequestBuilder;
 import org.springdoc.core.AbstractResponseBuilder;
 import org.springdoc.core.OpenAPIBuilder;
 import org.springdoc.core.OperationBuilder;
-import org.springdoc.core.customizers.OpenApiCustomiser;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.annotation.AnnotationUtils;
 import org.springframework.http.MediaType;
diff --git a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/MultipleOpenApiSupportConfiguration.java b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/MultipleOpenApiSupportConfiguration.java
index 84b7f71d0..9c9221d50 100644
--- a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/MultipleOpenApiSupportConfiguration.java
+++ b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/MultipleOpenApiSupportConfiguration.java
@@ -6,9 +6,12 @@ import org.springdoc.api.MultipleOpenApiResource;
 import org.springframework.beans.factory.ObjectFactory;
 import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.DispatcherServlet;
 import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
 
 import java.util.List;
@@ -18,6 +21,8 @@ import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
 
 
 @Configuration
+@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
+@ConditionalOnClass(DispatcherServlet.class)
 @ConditionalOnBean(GroupedOpenApi.class)
 @ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
 public class MultipleOpenApiSupportConfiguration {
diff --git a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/RequestBuilder.java b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/RequestBuilder.java
index 6761a2a14..f973e4e59 100644
--- a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/RequestBuilder.java
+++ b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/RequestBuilder.java
@@ -1,10 +1,7 @@
 package org.springdoc.core;
 
-import org.springdoc.core.customizers.OperationCustomizer;
-import org.springdoc.core.customizers.ParameterCustomizer;
-
-import java.util.List;
-import java.util.Optional;
+import io.swagger.v3.oas.models.Operation;
+import org.springframework.web.method.HandlerMethod;
 
 public class RequestBuilder extends AbstractRequestBuilder {
 
@@ -18,8 +15,12 @@ public class RequestBuilder extends AbstractRequestBuilder {
     }
 
     public RequestBuilder(AbstractParameterBuilder parameterBuilder, RequestBodyBuilder requestBodyBuilder,
-                          OperationBuilder operationBuilder, Optional<List<OperationCustomizer>> customizers,
-                          Optional<List<ParameterCustomizer>> parameterCustomizers) {
-        super(parameterBuilder, requestBodyBuilder, operationBuilder, customizers, parameterCustomizers);
+                          OperationBuilder operationBuilder) {
+        super(parameterBuilder, requestBodyBuilder, operationBuilder);
+    }
+
+    @Override
+    protected Operation customiseOperation(Operation operation, HandlerMethod handlerMethod) {
+        return operation;
     }
 }
diff --git a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/SpringDocWebMvcActuatorConfiguration.java b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/SpringDocWebMvcActuatorConfiguration.java
deleted file mode 100644
index 77447459d..000000000
--- a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/SpringDocWebMvcActuatorConfiguration.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.springdoc.core;
-
-import org.springdoc.api.ActuatorProvider;
-import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-
-import static org.springdoc.core.Constants.SPRINGDOC_SHOW_ACTUATOR;
-
-@Configuration
-@ConditionalOnProperty(name = SPRINGDOC_SHOW_ACTUATOR)
-public class SpringDocWebMvcActuatorConfiguration {
-
-    @Bean
-    public ActuatorProvider actuatorProvider(WebMvcEndpointHandlerMapping webMvcEndpointHandlerMapping) {
-        return new ActuatorProvider(webMvcEndpointHandlerMapping);
-    }
-
-}
diff --git a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/SpringDocWebMvcConfiguration.java b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/SpringDocWebMvcConfiguration.java
index 14ac740b8..d94758d85 100644
--- a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/SpringDocWebMvcConfiguration.java
+++ b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/core/SpringDocWebMvcConfiguration.java
@@ -1,23 +1,27 @@
 package org.springdoc.core;
 
 import org.springdoc.api.ActuatorProvider;
+import org.springdoc.api.OpenApiCustomiser;
 import org.springdoc.api.OpenApiResource;
-import org.springdoc.core.customizers.OpenApiCustomiser;
-import org.springdoc.core.customizers.OperationCustomizer;
-import org.springdoc.core.customizers.ParameterCustomizer;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
+import org.springframework.web.servlet.DispatcherServlet;
 import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
 
 import java.util.List;
 import java.util.Optional;
 
 import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
+import static org.springdoc.core.Constants.SPRINGDOC_SHOW_ACTUATOR;
 
 @Configuration
+@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
+@ConditionalOnClass(DispatcherServlet.class)
 @ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
 public class SpringDocWebMvcConfiguration {
 
@@ -33,23 +37,44 @@ public class SpringDocWebMvcConfiguration {
     }
 
     @Bean
-    @ConditionalOnMissingBean
     public ParameterBuilder parameterBuilder(LocalVariableTableParameterNameDiscoverer localSpringDocParameterNameDiscoverer, IgnoredParameterAnnotations ignoredParameterAnnotations) {
         return new ParameterBuilder(localSpringDocParameterNameDiscoverer, ignoredParameterAnnotations);
     }
 
     @Bean
-    @ConditionalOnMissingBean
+    public OperationBuilder operationBuilder(AbstractParameterBuilder parameterBuilder, RequestBodyBuilder requestBodyBuilder,
+                                             SecurityParser securityParser, OpenAPIBuilder openAPIBuilder, PropertyResolverUtils propertyResolverUtils) {
+        return new OperationBuilder(parameterBuilder, requestBodyBuilder,
+                securityParser, openAPIBuilder, propertyResolverUtils);
+    }
+
+    @Bean
+    public RequestBodyBuilder requestBodyBuilder(AbstractParameterBuilder parameterBuilder) {
+        return new RequestBodyBuilder(parameterBuilder);
+    }
+
+    @Bean
     public RequestBuilder requestBuilder(AbstractParameterBuilder parameterBuilder, RequestBodyBuilder requestBodyBuilder,
-                                         OperationBuilder operationBuilder, Optional<List<OperationCustomizer>> operationCustomizers, Optional<List<ParameterCustomizer>> parameterCustomizers) {
+                                         OperationBuilder operationBuilder) {
         return new RequestBuilder(parameterBuilder, requestBodyBuilder,
-                operationBuilder, operationCustomizers, parameterCustomizers);
+                operationBuilder);
     }
 
     @Bean
-    @ConditionalOnMissingBean
     public ResponseBuilder responseBuilder(OperationBuilder operationBuilder) {
         return new ResponseBuilder(operationBuilder);
     }
 
+    @Configuration
+    @ConditionalOnProperty(name = SPRINGDOC_SHOW_ACTUATOR)
+    @ConditionalOnClass(WebMvcEndpointHandlerMapping.class)
+    public static class SpringDocWebMvcActuatorConfiguration {
+
+        @Bean
+        public ActuatorProvider actuatorProvider(WebMvcEndpointHandlerMapping webMvcEndpointHandlerMapping) {
+            return new ActuatorProvider(webMvcEndpointHandlerMapping);
+        }
+
+    }
+
 }
diff --git a/springdoc-openapi-webmvc-core/src/main/resources/META-INF/spring.factories b/springdoc-openapi-webmvc-core/src/main/resources/META-INF/spring.factories
index e16d199c5..ff7ea7b74 100644
--- a/springdoc-openapi-webmvc-core/src/main/resources/META-INF/spring.factories
+++ b/springdoc-openapi-webmvc-core/src/main/resources/META-INF/spring.factories
@@ -1,4 +1,3 @@
 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
 org.springdoc.core.SpringDocWebMvcConfiguration,\
-org.springdoc.core.SpringDocWebMvcActuatorConfiguration,\
 org.springdoc.core.MultipleOpenApiSupportConfiguration
\ No newline at end of file


Test patch:
diff --git a/springdoc-openapi-data-rest/src/test/java/test/org/springdoc/api/app3/HelloController.java b/springdoc-openapi-data-rest/src/test/java/test/org/springdoc/api/app3/HelloController.java
index 7e27b1b32..f37a1ec2f 100644
--- a/springdoc-openapi-data-rest/src/test/java/test/org/springdoc/api/app3/HelloController.java
+++ b/springdoc-openapi-data-rest/src/test/java/test/org/springdoc/api/app3/HelloController.java
@@ -7,7 +7,6 @@ import io.swagger.v3.oas.annotations.enums.ParameterIn;
 import io.swagger.v3.oas.annotations.media.ArraySchema;
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
-import org.springdoc.core.converters.PageableAsQueryParam;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -30,5 +29,23 @@ public class HelloController {
     }
 
 
+    @Parameters({
+            @Parameter(in = ParameterIn.QUERY
+                    , description = "Page you want to retrieve (0..N)"
+                    , name = "page"
+                    , content = @Content(schema = @Schema(type = "integer", defaultValue = "0"))),
+            @Parameter(in = ParameterIn.QUERY
+                    , description = "Number of records per page."
+                    , name = "size"
+                    , content = @Content(schema = @Schema(type = "integer", defaultValue = "20"))),
+            @Parameter(in = ParameterIn.QUERY
+                    , description = "Sorting criteria in the format: property(,asc|desc). "
+                    + "Default sort order is ascending. " + "Multiple sort criteria are supported."
+                    , name = "sort"
+                    , content = @Content(array = @ArraySchema(schema = @Schema(type = "string"))))
+    })
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target({ElementType.METHOD})
+    public @interface PageableAsQueryParam {}
 
 }
\ No newline at end of file
diff --git a/springdoc-openapi-data-rest/src/test/resources/results/app3.json b/springdoc-openapi-data-rest/src/test/resources/results/app3.json
index 69f5364bb..d1920e9bb 100644
--- a/springdoc-openapi-data-rest/src/test/resources/results/app3.json
+++ b/springdoc-openapi-data-rest/src/test/resources/results/app3.json
@@ -21,7 +21,7 @@
           {
             "name": "page",
             "in": "query",
-            "description": "Zero-based page index (0..N)",
+            "description": "Page you want to retrieve (0..N)",
             "schema": {
               "type": "integer",
               "default": "0"
@@ -30,7 +30,7 @@
           {
             "name": "size",
             "in": "query",
-            "description": "The size of the page to be returned",
+            "description": "Number of records per page.",
             "schema": {
               "type": "integer",
               "default": "20"
diff --git a/springdoc-openapi-webflux-core/src/test/java/test/org/springdoc/api/app39/SpringDocTestApp.java b/springdoc-openapi-webflux-core/src/test/java/test/org/springdoc/api/app39/SpringDocTestApp.java
index fd68fdde4..48dea61b7 100644
--- a/springdoc-openapi-webflux-core/src/test/java/test/org/springdoc/api/app39/SpringDocTestApp.java
+++ b/springdoc-openapi-webflux-core/src/test/java/test/org/springdoc/api/app39/SpringDocTestApp.java
@@ -4,7 +4,7 @@ import io.swagger.v3.oas.models.Components;
 import io.swagger.v3.oas.models.OpenAPI;
 import io.swagger.v3.oas.models.media.StringSchema;
 import io.swagger.v3.oas.models.parameters.HeaderParameter;
-import org.springdoc.core.customizers.OpenApiCustomiser;
+import org.springdoc.api.OpenApiCustomiser;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.annotation.Bean;
diff --git a/springdoc-openapi-webflux-core/src/test/java/test/org/springdoc/api/core/ReactiveAutoConfigurationTest.java b/springdoc-openapi-webflux-core/src/test/java/test/org/springdoc/api/core/ReactiveAutoConfigurationTest.java
new file mode 100644
index 000000000..70a1dd4ce
--- /dev/null
+++ b/springdoc-openapi-webflux-core/src/test/java/test/org/springdoc/api/core/ReactiveAutoConfigurationTest.java
@@ -0,0 +1,57 @@
+package test.org.springdoc.api.core;
+
+import org.junit.Test;
+import org.springframework.boot.SpringBootConfiguration;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.context.FilteredClassLoader;
+import org.springframework.boot.test.context.runner.ApplicationContextRunner;
+import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ReactiveAutoConfigurationTest {
+
+    private final ReactiveWebApplicationContextRunner contextRunner = new ReactiveWebApplicationContextRunner()
+            .withUserConfiguration(TestApp.class);
+
+    @Test
+    public void configurations_successfully_loaded() {
+        contextRunner
+                .run(context -> assertThat(context)
+                        .hasNotFailed()
+                        .hasBean("openApiResource"));
+    }
+
+    @Test
+    public void configurations_not_loaded_when_application_is_not_web() {
+        new ApplicationContextRunner()
+                .withUserConfiguration(TestApp.class)
+                .run(context -> assertThat(context)
+                        .hasNotFailed()
+                        .doesNotHaveBean("openApiResource"));
+    }
+
+    @Test
+    public void configurations_not_loaded_when_disabled() {
+        contextRunner
+                .withPropertyValues("springdoc.api-docs.enabled=false")
+                .run(context -> assertThat(context)
+                        .hasNotFailed()
+                        .doesNotHaveBean("openApiResource"));
+    }
+
+    @Test
+    public void configurations_not_loaded_when_reactor_is_not_on_class_path() {
+        contextRunner
+                .withClassLoader(new FilteredClassLoader("reactor.core"))
+                .run(context -> assertThat(context)
+                        .hasNotFailed()
+                        .doesNotHaveBean("openApiResource"));
+
+    }
+
+    @SpringBootConfiguration
+    @EnableAutoConfiguration
+    protected static class TestApp {
+    }
+}
\ No newline at end of file
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app39/SpringDocTestApp.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app39/SpringDocTestApp.java
index 68b5c3f8a..4fd50ebae 100644
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app39/SpringDocTestApp.java
+++ b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app39/SpringDocTestApp.java
@@ -4,7 +4,7 @@ import io.swagger.v3.oas.models.Components;
 import io.swagger.v3.oas.models.OpenAPI;
 import io.swagger.v3.oas.models.media.StringSchema;
 import io.swagger.v3.oas.models.parameters.HeaderParameter;
-import org.springdoc.core.customizers.OpenApiCustomiser;
+import org.springdoc.api.OpenApiCustomiser;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.annotation.Bean;
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/HelloController.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/HelloController.java
deleted file mode 100644
index d25b6af9e..000000000
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/HelloController.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package test.org.springdoc.api.app70;
-
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RestController;
-import test.org.springdoc.api.app70.customizer.CustomizedOperation;
-import test.org.springdoc.api.app70.customizer.CustomizedParameter;
-import test.org.springdoc.api.app70.model.ApiType;
-
-@RestController
-public class HelloController {
-
-    @CustomizedOperation
-    @Operation(description = "Some operation")
-    @GetMapping("/example/{test}")
-    public ApiType test(@PathVariable @CustomizedParameter @Parameter(description = "Parameter description") String test) {
-        return new ApiType();
-    }
-}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/SpringDocApp70Test.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/SpringDocApp70Test.java
deleted file mode 100644
index 2e8f04bc1..000000000
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/SpringDocApp70Test.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package test.org.springdoc.api.app70;
-
-import test.org.springdoc.api.AbstractSpringDocTest;
-
-public class SpringDocApp70Test extends AbstractSpringDocTest {
-}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/SpringDocTestApp.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/SpringDocTestApp.java
deleted file mode 100644
index 1e1461f1a..000000000
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/SpringDocTestApp.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package test.org.springdoc.api.app70;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class SpringDocTestApp {
-    public static void main(String[] args) {
-        SpringApplication.run(SpringDocTestApp.class, args);
-    }
-}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/CustomizedOperation.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/CustomizedOperation.java
deleted file mode 100644
index fcc628a48..000000000
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/CustomizedOperation.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package test.org.springdoc.api.app70.customizer;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-@Retention(RetentionPolicy.RUNTIME)
-public @interface CustomizedOperation {
-	String addition() default "customized operation!";
-}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/CustomizedParameter.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/CustomizedParameter.java
deleted file mode 100644
index 1405eee27..000000000
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/CustomizedParameter.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package test.org.springdoc.api.app70.customizer;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-@Retention(RetentionPolicy.RUNTIME)
-public @interface CustomizedParameter {
-	String addition() default "customized parameter!";
-}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/CustomizedProperty.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/CustomizedProperty.java
deleted file mode 100644
index 49a60b0a2..000000000
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/CustomizedProperty.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package test.org.springdoc.api.app70.customizer;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-@Retention(RetentionPolicy.RUNTIME)
-public @interface CustomizedProperty {
-	String addition() default "customized property!";
-}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/OperationCustomizer.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/OperationCustomizer.java
deleted file mode 100644
index 17d01ec9d..000000000
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/OperationCustomizer.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package test.org.springdoc.api.app70.customizer;
-
-import org.springframework.stereotype.Component;
-import org.springframework.web.method.HandlerMethod;
-
-import io.swagger.v3.oas.models.Operation;
-
-@Component
-public class OperationCustomizer implements org.springdoc.core.customizers.OperationCustomizer {
-	@Override
-	public Operation customize(Operation operation, HandlerMethod handlerMethod) {
-		CustomizedOperation annotation = handlerMethod.getMethodAnnotation(CustomizedOperation.class);
-		if(annotation != null){
-			operation.description(operation.getDescription() + ", " + annotation.addition());
-		}
-		return operation;
-	}
-}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/ParameterCustomizer.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/ParameterCustomizer.java
deleted file mode 100644
index a02b2a9d0..000000000
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/ParameterCustomizer.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package test.org.springdoc.api.app70.customizer;
-
-import org.springframework.stereotype.Component;
-import org.springframework.web.method.HandlerMethod;
-
-import io.swagger.v3.oas.models.parameters.Parameter;
-
-@Component
-public class ParameterCustomizer implements org.springdoc.core.customizers.ParameterCustomizer {
-	@Override
-	public Parameter customize(Parameter parameterModel, java.lang.reflect.Parameter parameter, HandlerMethod handlerMethod) {
-		CustomizedParameter annotation = parameter.getAnnotation(CustomizedParameter.class);
-		if(annotation != null){
-			parameterModel.description(parameterModel.getDescription() + ", " + annotation.addition());
-		}
-		return parameterModel;
-	}
-}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/PropertyCustomizer.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/PropertyCustomizer.java
deleted file mode 100644
index 63453d01a..000000000
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/customizer/PropertyCustomizer.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package test.org.springdoc.api.app70.customizer;
-
-import io.swagger.v3.core.converter.AnnotatedType;
-import io.swagger.v3.oas.models.media.Schema;
-import org.springframework.stereotype.Component;
-
-import java.lang.annotation.Annotation;
-import java.util.Optional;
-import java.util.stream.Stream;
-
-@Component
-public class PropertyCustomizer implements org.springdoc.core.customizers.PropertyCustomizer {
-	@Override
-	public Schema<?> customize(Schema<?> property, AnnotatedType type) {
-		Annotation[] ctxAnnotations = type.getCtxAnnotations();
-		if(ctxAnnotations == null) {
-			return property;
-		}
-
-		Optional<CustomizedProperty> propertyAnnotation = Stream.of(ctxAnnotations)
-				.filter(CustomizedProperty.class::isInstance)
-				.findFirst()
-				.map(CustomizedProperty.class::cast);
-
-		propertyAnnotation
-				.ifPresent(annotation -> property.description(property.getDescription() + ", " + annotation.addition()));
-
-		return property;
-	}
-}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/model/ApiType.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/model/ApiType.java
deleted file mode 100644
index 2f0baad14..000000000
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app70/model/ApiType.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package test.org.springdoc.api.app70.model;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import test.org.springdoc.api.app70.customizer.CustomizedProperty;
-
-public class ApiType {
-	@CustomizedProperty
-	@Schema(description = "Test description")
-	private String someProperty;
-
-	public String getSomeProperty() {
-		return someProperty;
-	}
-
-	public void setSomeProperty(String someProperty) {
-		this.someProperty = someProperty;
-	}
-}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/core/BlockingAutoConfigurationTest.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/core/BlockingAutoConfigurationTest.java
new file mode 100644
index 000000000..57ac61858
--- /dev/null
+++ b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/core/BlockingAutoConfigurationTest.java
@@ -0,0 +1,91 @@
+package test.org.springdoc.core;
+
+import org.junit.Test;
+import org.springdoc.core.GroupedOpenApi;
+import org.springframework.boot.SpringBootConfiguration;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.context.FilteredClassLoader;
+import org.springframework.boot.test.context.runner.ApplicationContextRunner;
+import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
+import org.springframework.context.annotation.Bean;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class BlockingAutoConfigurationTest {
+
+    private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner()
+            .withUserConfiguration(TestApp.class);
+
+    @Test
+    public void configurations_successfully_loaded() {
+        contextRunner
+                .withPropertyValues("springdoc.show-actuator=true")
+                .run(context -> assertThat(context)
+                        .hasNotFailed()
+                        .hasBean("openApiResource")
+                        .hasBean("actuatorProvider")
+                        .hasBean("multipleOpenApiResource")
+                );
+    }
+
+    @Test
+    public void configurations_not_loaded_when_application_is_not_web() {
+        new ApplicationContextRunner()
+                .withUserConfiguration(TestApp.class)
+                .run(context -> assertThat(context)
+                        .hasNotFailed()
+                        .doesNotHaveBean("openApiResource")
+                        .doesNotHaveBean("actuatorProvider")
+                        .doesNotHaveBean("multipleOpenApiResource")
+                );
+    }
+
+    @Test
+    public void actuator_configuration_not_loaded_when_not_enabled_explicitly() {
+        contextRunner
+                .run(context -> assertThat(context)
+                        .hasNotFailed()
+                        .hasBean("openApiResource")
+                        .doesNotHaveBean("actuatorProvider")
+                        .hasBean("multipleOpenApiResource")
+                );
+    }
+
+    @Test
+    public void configurations_not_loaded_when_disabled() {
+        contextRunner
+                .withPropertyValues("springdoc.api-docs.enabled=false")
+                .run(context -> assertThat(context)
+                        .hasNotFailed()
+                        .doesNotHaveBean("openApiResource")
+                        .doesNotHaveBean("actuatorProvider")
+                        .doesNotHaveBean("multipleOpenApiResource")
+                );
+    }
+
+    @Test
+    public void configurations_not_loaded_when_mvc_is_not_on_class_path() {
+        contextRunner
+                .withClassLoader(new FilteredClassLoader("org.springframework.web.servlet"))
+                .run(context -> assertThat(context)
+                        .hasNotFailed()
+                        .doesNotHaveBean("openApiResource")
+                        .doesNotHaveBean("actuatorProvider")
+                        .doesNotHaveBean("multipleOpenApiResource")
+                );
+
+    }
+
+    @SpringBootConfiguration
+    @EnableAutoConfiguration
+    protected static class TestApp {
+
+        @Bean
+        GroupedOpenApi testGroupedOpenApi() {
+            return GroupedOpenApi.builder()
+                    .setGroup("test-group")
+                    .packagesToScan("org.test")
+                    .build();
+        }
+    }
+}
\ No newline at end of file
diff --git a/springdoc-openapi-webmvc-core/src/test/resources/results/app70.json b/springdoc-openapi-webmvc-core/src/test/resources/results/app70.json
deleted file mode 100644
index 6f122a735..000000000
--- a/springdoc-openapi-webmvc-core/src/test/resources/results/app70.json
+++ /dev/null
@@ -1,60 +0,0 @@
-{
-  "openapi": "3.0.1",
-  "info": {
-    "title": "OpenAPI definition",
-    "version": "v0"
-  },
-  "servers": [
-    {
-      "url": "http://localhost",
-      "description": "Generated server url"
-    }
-  ],
-  "paths": {
-    "/example/{test}": {
-      "get": {
-        "tags": [
-          "hello-controller"
-        ],
-        "description": "Some operation, customized operation!",
-        "operationId": "test",
-        "parameters": [
-          {
-            "name": "test",
-            "in": "path",
-            "description": "Parameter description, customized parameter!",
-            "required": true,
-            "schema": {
-              "type": "string"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "default response",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/ApiType"
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  },
-  "components": {
-    "schemas": {
-      "ApiType": {
-        "type": "object",
-        "properties": {
-          "someProperty": {
-            "type": "string",
-            "description": "Test description, customized property!"
-          }
-        }
-      }
-    }
-  }
-}