Repository: springdoc/springdoc-openapi
Pull request #1771 (2022-08-01 13:04:46)

Fixes issue with subclassing unbounded generics as query param
## Describe the bug

Nested POJOS for `@ParameterObject` works not with unbounded generic classes, even if you make them reifiable for reflection.

## To Reproduce
### What version of spring-boot you are using?
1.6.9

### What modules and versions of springdoc-openapi are you using?
- springdoc-openapi-ui

### What is the actual and the expected result using OpenAPI Description (yml or json)?

actual
```json
{
  "openapi": "3.0.1",
  "info": { "title": "OpenAPI definition", "version": "v0" },
  "servers": [
    { "url": "http://localhost:8080", "description": "Generated server url" }
  ],
  "tags": [{ "name": "Test", "description": "Contains test endpoints" }],
  "paths": {
    "/hello/nested-generic": {
      "get": {
        "tags": ["Test"],
        "operationId": "get",
        "parameters": [
          {
            "name": "filter",
            "in": "query",
            "required": false,
            "schema": { "$ref": "#/components/schemas/MatchFilterDto" }
          }
        ],
        "responses": { "200": { "description": "OK" } }
      }
    }
  },
  "components": {
    "schemas": {
      "MatchFilterDto": {
        "type": "object",
        "properties": {
          "query": { "type": "string" },
          "matchesInThePastOnly": { "type": "boolean" },
          "timeRange": { "$ref": "#/components/schemas/TimeRangeFilterDto" }
        }
      },
      "TimeRangeFilterDto": {
        "type": "object",
        "properties": {
          "start": { "type": "string", "format": "date-time" },
          "end": { "type": "string", "format": "date-time" }
        }
      }
    }
  }
}
```

expected
```json
{
  "openapi": "3.0.1",
  "info": { "title": "OpenAPI definition", "version": "v0" },
  "servers": [
    { "url": "http://localhost:8080", "description": "Generated server url" }
  ],
  "tags": [{ "name": "Test", "description": "Contains test endpoints" }],
  "paths": {
    "/hello/nested-generic": {
      "get": {
        "tags": ["Test"],
        "operationId": "get",
        "parameters": [
          {
            "name": "filter.query",
            "in": "query",
            "required": false,
            "schema": { "type": "string" }
          },
          {
            "name": "filter.matchesInThePastOnly",
            "in": "query",
            "description": "Specified, if only matches in the past should filter",
            "required": false,
            "schema": { "type": "boolean" }
          },
          {
            "name": "filter.timeRange.start",
            "in": "query",
            "required": false,
            "schema": { "type": "string", "format": "date-time" }
          },
          {
            "name": "filter.timeRange.end",
            "in": "query",
            "required": false,
            "schema": { "type": "string", "format": "date-time" }
          }
        ],
        "responses": { "200": { "description": "OK" } }
      }
    }
  },
  "components": {}
}
```

### Provide with a sample code (HelloController) or Test that reproduces the problem

**All classes have a getter method for each member. I have left this out in the example for easier reading**
```java
public class TimeRangeFilterDto {
    Instant start;
    Instant end;
}

public class MatchFilterDto {
    String query;

    @Parameter(description = "Specified, if only matches in the past should filter")
    Boolean matchesInThePastOnly;

    @Parameter(description = "Adds possibility to filter time ranges")
    TimeRangeFilterDto timeRange;
}

public abstract class Filter<T> {
    T filter;
}

// Make generic reifiable for reflection
public class MatchFilterQueryDto extends Filter<MatchFilterDto> {
}
```

```java
@RestController
@RequestMapping("/hello")
public class HelloController {

    @GetMapping(value = "/nested-generic", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Void> get(@ParameterObject MatchFilterQueryDto filter) {

        return ResponseEntity.noContent().build();
    }
}
```


## Expected behavior
When we use the `@ParameterObject` on a POJO class, we expect that the field's of the given pojos are "exploded" (with a DOT as seperator for a depth change). This are working for simple pojos and bounded generics, as we can see this in [SpringDocApp155Test](https://github.com/springdoc/springdoc-openapi/blob/master/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app155/HelloController.java).

But when you use a concrete subclass class for unbounded generic type with `@ParameterObject` the result is not was I expected.

## Screenshots
Actual
![Bildschirmfoto 2022-08-01 um 13 01 41](https://user-images.githubusercontent.com/12803598/182134747-8712e82f-6175-41f9-b936-fe6f0e6ff68e.png)

Expected
![Bildschirmfoto 2022-08-01 um 13 02 37](https://user-images.githubusercontent.com/12803598/182134783-91bd6db7-0e3b-4974-9e78-0311d1f64359.png)


Patch:
diff --git a/pom.xml b/pom.xml
index d6499e643..196bb3286 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,3 +1,25 @@
+<!--
+  ~ /*
+  ~  *
+  ~  *  *
+  ~  *  *  * 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.
+  ~  *  *
+  ~  *
+  ~  */
+  -->
+
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>org.springdoc</groupId>
@@ -11,7 +33,7 @@
 	<parent>
 		<groupId>org.springframework.boot</groupId>
 		<artifactId>spring-boot-starter-parent</artifactId>
-		<version>2.7.2</version>
+		<version>2.7.0</version>
 	</parent>
 
 	<licenses>
@@ -77,8 +99,8 @@
 		<jaxb-impl.version>2.1</jaxb-impl.version>
 		<javax.jws-api.version>1.1</javax.jws-api.version>
 		<jjwt.version>0.9.1</jjwt.version>
-		<spring-native.version>0.12.1</spring-native.version>
-		<therapi-runtime-javadoc.version>0.15.0</therapi-runtime-javadoc.version>
+		<spring-native.version>0.11.5</spring-native.version>
+		<therapi-runtime-javadoc.version>0.13.0</therapi-runtime-javadoc.version>
 		<spring-cloud-function.version>3.2.4</spring-cloud-function.version>
 		<dependency-check.version>7.1.0</dependency-check.version>
 	</properties>
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 cd2186277..b73fcb602 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
@@ -169,7 +169,7 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
 	private final OperationService operationParser;
 
 	/**
-	 * The Open api customizers.
+	 * The Open api customisers.
 	 */
 	private final Optional<List<OpenApiCustomiser>> openApiCustomisers;
 
@@ -299,7 +299,7 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
 	 * @return the open api
 	 */
 	protected synchronized OpenAPI getOpenApi(Locale locale) {
-		final OpenAPI openAPI;
+		OpenAPI openAPI;
 		final Locale finalLocale = locale == null ? Locale.getDefault() : locale;
 		if (openAPIService.getCachedOpenAPI(finalLocale) == null || springDocConfigProperties.isCacheDisabled()) {
 			Instant start = Instant.now();
@@ -327,12 +327,29 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
 							this.calculatePath(routerOperationList, locale, openAPI);
 					}
 			);
+
 			if (!CollectionUtils.isEmpty(openAPI.getServers()))
 				openAPIService.setServersPresent(true);
+			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());
+			}
+
+			openApiLocaleCustomizers.values().forEach(openApiLocaleCustomizer -> openApiLocaleCustomizer.customise(openAPI, finalLocale));
+			openApiCustomisers.ifPresent(apiCustomisers -> apiCustomisers.forEach(openApiCustomiser -> openApiCustomiser.customise(openAPI)));
+			if (!CollectionUtils.isEmpty(openAPI.getServers()) && !openAPI.getServers().equals(serversCopy))
+				openAPIService.setServersPresent(true);
 
 			openAPIService.setCachedOpenAPI(openAPI, finalLocale);
 
@@ -341,11 +358,8 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
 		}
 		else {
 			LOGGER.debug("Fetching openApi document from cache");
-			openAPI = openAPIService.getCachedOpenAPI(finalLocale);
+			openAPI = openAPIService.updateServers(openAPIService.getCachedOpenAPI(finalLocale));
 		}
-		openAPIService.updateServers(openAPI);
-		openApiLocaleCustomizers.values().forEach(openApiLocaleCustomizer -> openApiLocaleCustomizer.customise(openAPI, finalLocale));
-		openApiCustomisers.ifPresent(apiCustomizers -> apiCustomizers.forEach(openApiCustomizer -> openApiCustomizer.customise(openAPI)));
 		return openAPI;
 	}
 
@@ -1313,4 +1327,4 @@ public abstract class AbstractOpenApiResource extends SpecFilter {
 	public static void setModelAndViewClass(Class<?> modelAndViewClass) {
 		AbstractOpenApiResource.modelAndViewClass = modelAndViewClass;
 	}
-}
\ No newline at end of file
+}
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/AbstractRequestService.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/AbstractRequestService.java
index 9b43bbfdc..cbf8d35fa 100644
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/AbstractRequestService.java
+++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/AbstractRequestService.java
@@ -31,11 +31,9 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
@@ -259,15 +257,6 @@ public abstract class AbstractRequestService {
 
 			if (parameterDoc == null)
 				parameterDoc = parametersDocMap.get(parameterInfo.getpName());
-
-			if (parameterDoc == null) {
-				io.swagger.v3.oas.annotations.media.Schema schema = AnnotatedElementUtils.findMergedAnnotation(
-						AnnotatedElementUtils.forAnnotations(methodParameter.getParameterAnnotations()), io.swagger.v3.oas.annotations.media.Schema.class);
-				if (schema != null) {
-					parameterDoc = parameterBuilder.generateParameterBySchema(schema);
-				}
-			}
-
 			// use documentation as reference
 			if (parameterDoc != null) {
 				if (parameterDoc.hidden() || parameterDoc.schema().hidden())
@@ -311,28 +300,6 @@ public abstract class AbstractRequestService {
 		}
 
 		LinkedHashMap<String, Parameter> map = getParameterLinkedHashMap(components, methodAttributes, operationParameters, parametersDocMap);
-		RequestBody requestBody = requestBodyInfo.getRequestBody();
-		// support form-data
-		if (requestBody != null
-				&& requestBody.getContent() != null
-				&& requestBody.getContent().containsKey(org.springframework.http.MediaType.MULTIPART_FORM_DATA_VALUE)) {
-			io.swagger.v3.oas.models.media.Schema<?> mergedSchema = requestBodyInfo.getMergedSchema();
-			Iterator<Entry<String, Parameter>> it = map.entrySet().iterator();
-			while (it.hasNext()) {
-				Entry<String, Parameter> entry = it.next();
-				Parameter parameter = entry.getValue();
-				if (!ParameterIn.PATH.toString().equals(parameter.getIn())) {
-					io.swagger.v3.oas.models.media.Schema<?> itemSchema = new io.swagger.v3.oas.models.media.Schema() ;
-					itemSchema.setName(entry.getKey());
-					itemSchema.setDescription(parameter.getDescription());
-					itemSchema.setDeprecated(parameter.getDeprecated());
-					if (parameter.getExample() != null)
-						itemSchema.setExample(parameter.getExample());
-					mergedSchema.addProperty(entry.getKey(), itemSchema);
-					it.remove();
-				}
-			}
-		}
 		setParams(operation, new ArrayList<>(map.values()), requestBodyInfo);
 		return operation;
 	}
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/GenericParameterService.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/GenericParameterService.java
index 5322a2a6f..0c5137ef7 100644
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/GenericParameterService.java
+++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/GenericParameterService.java
@@ -23,7 +23,6 @@
 package org.springdoc.core;
 
 import java.io.IOException;
-import java.lang.annotation.Annotation;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.lang.reflect.WildcardType;
@@ -40,9 +39,6 @@ import com.fasterxml.jackson.annotation.JsonView;
 import io.swagger.v3.core.util.AnnotationsUtils;
 import io.swagger.v3.core.util.PrimitiveType;
 import io.swagger.v3.oas.annotations.enums.Explode;
-import io.swagger.v3.oas.annotations.enums.ParameterIn;
-import io.swagger.v3.oas.annotations.enums.ParameterStyle;
-import io.swagger.v3.oas.annotations.extensions.Extension;
 import io.swagger.v3.oas.annotations.media.ExampleObject;
 import io.swagger.v3.oas.models.Components;
 import io.swagger.v3.oas.models.examples.Example;
@@ -553,103 +549,4 @@ public class GenericParameterService {
 		}
 		return exprResolver.evaluate(placeholdersResolved, this.expressionContext);
 	}
-
-	/**
-	 * Generate parameter by schema
-	 *
-	 * @param schema the schema
-	 * @return the io.swagger.v3.oas.annotations.Parameter
-	 */
-	public io.swagger.v3.oas.annotations.Parameter generateParameterBySchema(io.swagger.v3.oas.annotations.media.Schema schema) {
-		return new io.swagger.v3.oas.annotations.Parameter() {
-			@Override
-			public Class<? extends Annotation> annotationType() {
-				return io.swagger.v3.oas.annotations.Parameter.class;
-			}
-			@Override
-			public String name() {
-				return schema.name();
-			}
-
-			@Override
-			public ParameterIn in() {
-				return ParameterIn.DEFAULT;
-			}
-
-			@Override
-			public String description() {
-				return schema.description();
-			}
-
-			@Override
-			public boolean required() {
-				return schema.required();
-			}
-
-			@Override
-			public boolean deprecated() {
-				return schema.deprecated();
-			}
-
-			@Override
-			public boolean allowEmptyValue() {
-				return false;
-			}
-
-			@Override
-			public ParameterStyle style() {
-				return ParameterStyle.DEFAULT;
-			}
-
-			@Override
-			public Explode explode() {
-				return Explode.DEFAULT;
-			}
-
-			@Override
-			public boolean allowReserved() {
-				return false;
-			}
-
-			@Override
-			public io.swagger.v3.oas.annotations.media.Schema schema() {
-				return schema;
-			}
-
-			@Override
-			public io.swagger.v3.oas.annotations.media.ArraySchema array() {
-				return null;
-			}
-
-			@Override
-			public io.swagger.v3.oas.annotations.media.Content[] content() {
-				return new io.swagger.v3.oas.annotations.media.Content[0];
-			}
-
-			@Override
-			public boolean hidden() {
-				return schema.hidden();
-			}
-
-			@Override
-			public ExampleObject[] examples() {
-				return new ExampleObject[0];
-			}
-
-			@Override
-			public String example() {
-				return schema.example();
-			}
-
-			@Override
-			public Extension[] extensions() {
-				return schema.extensions();
-			}
-
-			@Override
-			public String ref() {
-				return schema.ref();
-			}
-		};
-	}
 }
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/MethodParameterPojoExtractor.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/MethodParameterPojoExtractor.java
index 7e82058e6..5d6846458 100644
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/MethodParameterPojoExtractor.java
+++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/MethodParameterPojoExtractor.java
@@ -128,34 +128,37 @@ class MethodParameterPojoExtractor {
 	 * @return the stream
 	 */
 	private static Stream<MethodParameter> fromGetterOfField(Class<?> paramClass, Field field, String fieldNamePrefix) {
-		if (isSimpleType(field.getType()))
+		Class<?> type = extractType(paramClass, field);
+
+		if (Objects.isNull(type))
+			return Stream.empty();
+
+		if (isSimpleType(type))
 			return fromSimpleClass(paramClass, field, fieldNamePrefix);
-		else if (field.getGenericType() instanceof TypeVariable<?>)
-			return extractTypeParameter(paramClass, (TypeVariable<?>) field.getGenericType(), field, fieldNamePrefix);
-		else
-			return extractFrom(field.getType(), fieldNamePrefix + field.getName() + DOT);
+		else {
+			String prefix = fieldNamePrefix + field.getName() + DOT;
+			return extractFrom(type, prefix);
+		}
 	}
 
 	/**
-	 * Extract type parameter stream.
-	 *
-	 * @param owningClass the owning class
-	 * @param genericType the generic type
-	 * @param field the field
-	 * @param fieldNamePrefix the field name prefix
-	 * @return the stream
+	 * Extract the type
+	 * @param paramClass
+	 * @param field
+	 * @return The revoled type or null if it was not a reifiable type
 	 */
-	private static Stream<MethodParameter> extractTypeParameter(
-			Class<?> owningClass,
-			TypeVariable<?> genericType,
-			Field field,
-			String fieldNamePrefix) {
-
-		Type resolvedType = ReturnTypeParser.resolveType(genericType, owningClass);
-		if (resolvedType instanceof Class<?> && isSimpleType((Class<?>) resolvedType)) {
-			return fromSimpleClass(owningClass, field, fieldNamePrefix);
+	private static Class<?> extractType(Class<?> paramClass, Field field) {
+		Class<?> type = field.getType();
+		if (field.getGenericType() instanceof TypeVariable<?>) {
+			Type fieldType = ReturnTypeParser.resolveType(field.getGenericType(), paramClass);
+
+			if (fieldType instanceof Class<?>)
+				type = (Class<?>) fieldType;
+			else	// This is the case for not reifiable types
+				type = null;
 		}
-		return Stream.empty();
+
+		return type;
 	}
 
 	/**
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/OpenAPIService.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/OpenAPIService.java
index d1a9a9c57..30c86ee22 100644
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/OpenAPIService.java
+++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/OpenAPIService.java
@@ -296,8 +296,9 @@ public class OpenAPIService implements ApplicationContextAware {
 	 * Update servers open api.
 	 *
 	 * @param openAPI the open api
+	 * @return the open api
 	 */
-	public void updateServers(OpenAPI openAPI) {
+	public OpenAPI updateServers(OpenAPI openAPI) {
 		if (!isServersPresent && serverBaseUrl != null)        // default server value
 		{
 			Server server = new Server().url(serverBaseUrl).description(DEFAULT_SERVER_DESCRIPTION);
@@ -305,6 +306,7 @@ public class OpenAPIService implements ApplicationContextAware {
 			servers.add(server);
 			openAPI.setServers(servers);
 		}
+		return openAPI;
 	}
 
 	/**
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/ReturnTypeParser.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/ReturnTypeParser.java
index 5254cc69c..f12218bf1 100644
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/ReturnTypeParser.java
+++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/ReturnTypeParser.java
@@ -151,7 +151,7 @@ public interface ReturnTypeParser {
 	 */
 	static ResolvableType resolveVariable(TypeVariable<?> typeVariable, ResolvableType contextType) {
 		ResolvableType resolvedType;
-		if (contextType.hasGenerics() && Objects.equals(contextType.getRawClass(), typeVariable.getGenericDeclaration())){
+		if (contextType.hasGenerics()) {
 			resolvedType = ResolvableType.forType(typeVariable, contextType);
 			if (resolvedType.resolve() != null) {
 				return resolvedType;
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/ActuatorOperationCustomizer.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/ActuatorOperationCustomizer.java
index eb125ab4a..4d3a3d8be 100644
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/ActuatorOperationCustomizer.java
+++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/ActuatorOperationCustomizer.java
@@ -80,19 +80,17 @@ public class ActuatorOperationCustomizer implements GlobalOperationCustomizer {
 			if (operationFiled != null) {
 				try {
 					actuatorOperation = operationFiled.get(handlerMethod.getBean());
-					Field actuatorOperationFiled = FieldUtils.getDeclaredField(actuatorOperation.getClass(), OPERATION, true);
-					if(actuatorOperationFiled!=null){
-						AbstractDiscoveredOperation discoveredOperation = (AbstractDiscoveredOperation) actuatorOperationFiled.get(actuatorOperation);
-						OperationMethod operationMethod = discoveredOperation.getOperationMethod();
-						if (OperationType.WRITE.equals(operationMethod.getOperationType())) {
-							for (OperationParameter operationParameter : operationMethod.getParameters()) {
-								Field parameterField = FieldUtils.getDeclaredField(operationParameter.getClass(), PARAMETER, true);
-								Parameter parameter = (Parameter) parameterField.get(operationParameter);
-								Schema<?> schema = AnnotationsUtils.resolveSchemaFromType(parameter.getType(), null, null);
-								if (parameter.getAnnotation(Selector.class) == null) {
-									operation.setRequestBody(new RequestBody()
-											.content(new Content().addMediaType(org.springframework.http.MediaType.APPLICATION_JSON_VALUE, new MediaType().schema(schema))));
-								}
+					operationFiled = FieldUtils.getDeclaredField(actuatorOperation.getClass(), OPERATION, true);
+					AbstractDiscoveredOperation discoveredOperation = (AbstractDiscoveredOperation) operationFiled.get(actuatorOperation);
+					OperationMethod operationMethod = discoveredOperation.getOperationMethod();
+					if (OperationType.WRITE.equals(operationMethod.getOperationType())) {
+						for (OperationParameter operationParameter : operationMethod.getParameters()) {
+							Field parameterField = FieldUtils.getDeclaredField(operationParameter.getClass(), PARAMETER, true);
+							Parameter parameter = (Parameter) parameterField.get(operationParameter);
+							Schema<?> schema = AnnotationsUtils.resolveSchemaFromType(parameter.getType(), null, null);
+							if (parameter.getAnnotation(Selector.class) == null) {
+								operation.setRequestBody(new RequestBody()
+										.content(new Content().addMediaType(org.springframework.http.MediaType.APPLICATION_JSON_VALUE, new MediaType().schema(schema))));
 							}
 						}
 					}
diff --git a/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/DataRestDelegatingMethodParameterCustomizer.java b/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/DataRestDelegatingMethodParameterCustomizer.java
index 02d0b3155..6be158bf8 100644
--- a/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/DataRestDelegatingMethodParameterCustomizer.java
+++ b/springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/DataRestDelegatingMethodParameterCustomizer.java
@@ -141,7 +141,7 @@ public class DataRestDelegatingMethodParameterCustomizer implements DelegatingMe
 
 				@Override
 				public String description() {
-					return getDescription(parameterName, parameter.description());
+					return parameter.description();
 				}
 
 				@Override
@@ -675,8 +675,7 @@ public class DataRestDelegatingMethodParameterCustomizer implements DelegatingMe
 				if (isRepositoryRestConfigurationPresent())
 					name = optionalRepositoryRestConfigurationProvider.get().getRepositoryRestConfiguration().getLimitParamName();
 				else if (isSpringDataWebPropertiesPresent())
-					name = optionalSpringDataWebPropertiesProvider.get().getSpringDataWebProperties().getPageable().getPrefix() +
-							optionalSpringDataWebPropertiesProvider.get().getSpringDataWebProperties().getPageable().getSizeParameter();
+					name = optionalSpringDataWebPropertiesProvider.get().getSpringDataWebProperties().getPageable().getSizeParameter();
 				else
 					name = originalName;
 				break;
@@ -692,8 +691,7 @@ public class DataRestDelegatingMethodParameterCustomizer implements DelegatingMe
 				if (isRepositoryRestConfigurationPresent())
 					name = optionalRepositoryRestConfigurationProvider.get().getRepositoryRestConfiguration().getPageParamName();
 				else if (isSpringDataWebPropertiesPresent())
-					name = optionalSpringDataWebPropertiesProvider.get().getSpringDataWebProperties().getPageable().getPrefix() +
-						optionalSpringDataWebPropertiesProvider.get().getSpringDataWebProperties().getPageable().getPageParameter();
+					name = optionalSpringDataWebPropertiesProvider.get().getSpringDataWebProperties().getPageable().getPageParameter();
 				else
 					name = originalName;
 				break;
@@ -707,20 +705,6 @@ public class DataRestDelegatingMethodParameterCustomizer implements DelegatingMe
 		return name;
 	}
 
-	/**
-	 * Gets description.
-	 *
-	 * @param parameterName the parameter name
-	 * @param originalDescription the original description
-	 * @return the description
-	 */
-	private String getDescription(String parameterName, String originalDescription) {
-		if ("page".equals(parameterName) && isSpringDataWebPropertiesPresent() &&
-				optionalSpringDataWebPropertiesProvider.get().getSpringDataWebProperties().getPageable().isOneIndexedParameters())
-			return "One-based page index (1..N)";
-		return originalDescription;
-	}
-
 	/**
 	 * Gets default value.
 	 *
@@ -758,8 +742,6 @@ public class DataRestDelegatingMethodParameterCustomizer implements DelegatingMe
 			case "page":
 				if (pageableDefault != null)
 					defaultValue = String.valueOf(pageableDefault.page());
-				else if (isSpringDataWebPropertiesPresent() && optionalSpringDataWebPropertiesProvider.get().getSpringDataWebProperties().getPageable().isOneIndexedParameters())
-					defaultValue = "1";
 				else
 					defaultValue = defaultSchemaVal;
 				break;
diff --git a/springdoc-openapi-data-rest/src/main/java/org/springdoc/data/rest/SpringDocDataRestConfiguration.java b/springdoc-openapi-data-rest/src/main/java/org/springdoc/data/rest/SpringDocDataRestConfiguration.java
index fd4aa6aab..703121874 100644
--- a/springdoc-openapi-data-rest/src/main/java/org/springdoc/data/rest/SpringDocDataRestConfiguration.java
+++ b/springdoc-openapi-data-rest/src/main/java/org/springdoc/data/rest/SpringDocDataRestConfiguration.java
@@ -33,7 +33,6 @@ import org.springdoc.core.OpenAPIService;
 import org.springdoc.core.OperationService;
 import org.springdoc.core.RequestBodyService;
 import org.springdoc.core.SpringDocConfigProperties;
-import org.springdoc.core.SpringDocConfiguration;
 import org.springdoc.core.converters.models.DefaultPageable;
 import org.springdoc.core.providers.ObjectMapperProvider;
 import org.springdoc.data.rest.core.DataRestOperationService;
@@ -44,7 +43,6 @@ import org.springdoc.data.rest.core.DataRestTagsService;
 import org.springdoc.data.rest.customisers.QuerydslPredicateOperationCustomizer;
 import org.springdoc.data.rest.utils.SpringDocDataRestUtils;
 
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -79,7 +77,6 @@ import static org.springdoc.core.SpringDocUtils.getConfig;
 @Lazy(false)
 @Configuration(proxyBeanMethods = false)
 @ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
-@ConditionalOnBean(SpringDocConfiguration.class)
 public class SpringDocDataRestConfiguration {
 
 	/**
diff --git a/springdoc-openapi-groovy/src/main/java/org/springdoc/groovy/SpringDocGroovyConfiguration.java b/springdoc-openapi-groovy/src/main/java/org/springdoc/groovy/SpringDocGroovyConfiguration.java
index 9e084a48a..97ddd20d1 100644
--- a/springdoc-openapi-groovy/src/main/java/org/springdoc/groovy/SpringDocGroovyConfiguration.java
+++ b/springdoc-openapi-groovy/src/main/java/org/springdoc/groovy/SpringDocGroovyConfiguration.java
@@ -23,12 +23,10 @@
 package org.springdoc.groovy;
 
 import groovy.lang.MetaClass;
-import org.springdoc.core.SpringDocConfiguration;
 import org.springdoc.core.SpringDocUtils;
 import org.springdoc.core.converters.RequestTypeToIgnoreConverter;
 import org.springdoc.core.providers.ObjectMapperProvider;
 
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -43,7 +41,6 @@ import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
 @Lazy(false)
 @Configuration(proxyBeanMethods = false)
 @ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
-@ConditionalOnBean(SpringDocConfiguration.class)
 public class SpringDocGroovyConfiguration {
 
 	/**
diff --git a/springdoc-openapi-hateoas/src/main/java/org/springdoc/hateoas/SpringDocHateoasConfiguration.java b/springdoc-openapi-hateoas/src/main/java/org/springdoc/hateoas/SpringDocHateoasConfiguration.java
index 0f78550de..0f5c24e28 100644
--- a/springdoc-openapi-hateoas/src/main/java/org/springdoc/hateoas/SpringDocHateoasConfiguration.java
+++ b/springdoc-openapi-hateoas/src/main/java/org/springdoc/hateoas/SpringDocHateoasConfiguration.java
@@ -27,14 +27,12 @@ import java.util.Optional;
 import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.SerializerProvider;
 import org.springdoc.core.SpringDocConfigProperties;
-import org.springdoc.core.SpringDocConfiguration;
 import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
 import org.springdoc.core.providers.ObjectMapperProvider;
 import org.springdoc.hateoas.converters.CollectionModelContentConverter;
 import org.springdoc.hateoas.converters.OpenApiHateoasLinksCustomiser;
 import org.springdoc.hateoas.converters.RepresentationModelLinksOASMixin;
 
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -57,7 +55,6 @@ import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
 @Configuration(proxyBeanMethods = false)
 @ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
 @ConditionalOnClass(LinkRelationProvider.class)
-@ConditionalOnBean(SpringDocConfiguration.class)
 public class SpringDocHateoasConfiguration {
 
 	/**
diff --git a/springdoc-openapi-javadoc/src/main/java/org/springdoc/openapi/javadoc/SpringDocJavadocConfiguration.java b/springdoc-openapi-javadoc/src/main/java/org/springdoc/openapi/javadoc/SpringDocJavadocConfiguration.java
index 8e0dfdc55..50873e865 100644
--- a/springdoc-openapi-javadoc/src/main/java/org/springdoc/openapi/javadoc/SpringDocJavadocConfiguration.java
+++ b/springdoc-openapi-javadoc/src/main/java/org/springdoc/openapi/javadoc/SpringDocJavadocConfiguration.java
@@ -22,11 +22,9 @@
 
 package org.springdoc.openapi.javadoc;
 
-import org.springdoc.core.SpringDocConfiguration;
 import org.springdoc.core.providers.JavadocProvider;
 import org.springdoc.core.providers.ObjectMapperProvider;
 
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
@@ -43,7 +41,6 @@ import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
 @Lazy(false)
 @Configuration(proxyBeanMethods = false)
 @ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
-@ConditionalOnBean(SpringDocConfiguration.class)
 @ConditionalOnWebApplication
 public class SpringDocJavadocConfiguration {
 
diff --git a/springdoc-openapi-kotlin/src/main/java/org/springdoc/kotlin/SpringDocKotlinConfiguration.java b/springdoc-openapi-kotlin/src/main/java/org/springdoc/kotlin/SpringDocKotlinConfiguration.java
index 4735100c4..6f8dffb75 100644
--- a/springdoc-openapi-kotlin/src/main/java/org/springdoc/kotlin/SpringDocKotlinConfiguration.java
+++ b/springdoc-openapi-kotlin/src/main/java/org/springdoc/kotlin/SpringDocKotlinConfiguration.java
@@ -26,10 +26,9 @@ import com.fasterxml.jackson.module.kotlin.KotlinModule;
 import io.swagger.v3.oas.models.media.ByteArraySchema;
 import kotlin.Deprecated;
 import kotlin.coroutines.Continuation;
-import org.springdoc.core.SpringDocConfiguration;
+import kotlin.jvm.internal.Intrinsics;
 import org.springdoc.core.providers.ObjectMapperProvider;
 
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
@@ -46,7 +45,6 @@ import static org.springdoc.core.SpringDocUtils.getConfig;
 @Lazy(false)
 @Configuration(proxyBeanMethods = false)
 @ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
-@ConditionalOnBean(SpringDocConfiguration.class)
 public class SpringDocKotlinConfiguration {
 
 	/**
diff --git a/springdoc-openapi-kotlin/src/main/java/org/springdoc/kotlin/SpringDocKotlinxConfiguration.java b/springdoc-openapi-kotlin/src/main/java/org/springdoc/kotlin/SpringDocKotlinxConfiguration.java
index abf9f612c..4cd6a0fcf 100644
--- a/springdoc-openapi-kotlin/src/main/java/org/springdoc/kotlin/SpringDocKotlinxConfiguration.java
+++ b/springdoc-openapi-kotlin/src/main/java/org/springdoc/kotlin/SpringDocKotlinxConfiguration.java
@@ -23,9 +23,7 @@
 package org.springdoc.kotlin;
 
 import kotlinx.coroutines.flow.Flow;
-import org.springdoc.core.SpringDocConfiguration;
 
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Configuration;
@@ -42,7 +40,6 @@ import static org.springdoc.core.SpringDocUtils.getConfig;
 @ConditionalOnClass(Flow.class)
 @Configuration(proxyBeanMethods = false)
 @ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
-@ConditionalOnBean(SpringDocConfiguration.class)
 public class SpringDocKotlinxConfiguration {
 
 	/**
diff --git a/springdoc-openapi-native/src/main/java/org/springdoc/nativex/core/SpringDocHints.java b/springdoc-openapi-native/src/main/java/org/springdoc/nativex/core/SpringDocHints.java
index a15e37d65..915b263b3 100644
--- a/springdoc-openapi-native/src/main/java/org/springdoc/nativex/core/SpringDocHints.java
+++ b/springdoc-openapi-native/src/main/java/org/springdoc/nativex/core/SpringDocHints.java
@@ -138,7 +138,6 @@ import org.springdoc.core.providers.WebConversionServiceProvider;
 import org.springdoc.ui.AbstractSwaggerWelcome;
 
 import org.springframework.beans.factory.InitializingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Lazy;
@@ -310,7 +309,6 @@ import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
 @Configuration(proxyBeanMethods = false)
 @ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
 @ResourceHint(patterns = SpringDocHints.SPRINGDOC_CONFIG_PROPERTIES)
-@ConditionalOnBean(SpringDocConfiguration.class)
 public class SpringDocHints implements InitializingBean {
 
 	/**
diff --git a/springdoc-openapi-security/src/main/java/org/springdoc/security/SpringDocSecurityConfiguration.java b/springdoc-openapi-security/src/main/java/org/springdoc/security/SpringDocSecurityConfiguration.java
index 1ea5b4fb2..3400c0236 100644
--- a/springdoc-openapi-security/src/main/java/org/springdoc/security/SpringDocSecurityConfiguration.java
+++ b/springdoc-openapi-security/src/main/java/org/springdoc/security/SpringDocSecurityConfiguration.java
@@ -37,7 +37,6 @@ import io.swagger.v3.oas.models.responses.ApiResponse;
 import io.swagger.v3.oas.models.responses.ApiResponses;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springdoc.core.SpringDocConfiguration;
 import org.springdoc.core.customizers.OpenApiCustomiser;
 
 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
@@ -70,7 +69,6 @@ import static org.springdoc.core.SpringDocUtils.getConfig;
 @Lazy(false)
 @Configuration(proxyBeanMethods = false)
 @ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
-@ConditionalOnBean(SpringDocConfiguration.class)
 public class SpringDocSecurityConfiguration {
 
 	/**
diff --git a/springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/core/MultipleOpenApiSupportConfiguration.java b/springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/core/MultipleOpenApiSupportConfiguration.java
index 505ab45ea..7a8a5445c 100644
--- a/springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/core/MultipleOpenApiSupportConfiguration.java
+++ b/springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/core/MultipleOpenApiSupportConfiguration.java
@@ -31,7 +31,6 @@ import org.springdoc.core.MultipleOpenApiSupportCondition;
 import org.springdoc.core.OpenAPIService;
 import org.springdoc.core.OperationService;
 import org.springdoc.core.SpringDocConfigProperties;
-import org.springdoc.core.SpringDocConfiguration;
 import org.springdoc.core.SpringDocProviders;
 import org.springdoc.webflux.api.MultipleOpenApiActuatorResource;
 import org.springdoc.webflux.api.MultipleOpenApiWebFluxResource;
@@ -40,7 +39,6 @@ import org.springframework.beans.factory.ObjectFactory;
 import org.springframework.boot.actuate.autoconfigure.web.server.ConditionalOnManagementPort;
 import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
 import org.springframework.boot.actuate.endpoint.web.reactive.WebFluxEndpointHandlerMapping;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -63,7 +61,6 @@ import static org.springdoc.core.Constants.SPRINGDOC_USE_MANAGEMENT_PORT;
 @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
 @ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
 @Conditional(MultipleOpenApiSupportCondition.class)
-@ConditionalOnBean(SpringDocConfiguration.class)
 public class MultipleOpenApiSupportConfiguration {
 
 	/**
diff --git a/springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/core/SpringDocWebFluxConfiguration.java b/springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/core/SpringDocWebFluxConfiguration.java
index ced64ef6e..b046d6158 100644
--- a/springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/core/SpringDocWebFluxConfiguration.java
+++ b/springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/core/SpringDocWebFluxConfiguration.java
@@ -34,7 +34,6 @@ import org.springdoc.core.PropertyResolverUtils;
 import org.springdoc.core.RequestBodyService;
 import org.springdoc.core.ReturnTypeParser;
 import org.springdoc.core.SpringDocConfigProperties;
-import org.springdoc.core.SpringDocConfiguration;
 import org.springdoc.core.SpringDocProviders;
 import org.springdoc.core.customizers.OpenApiCustomiser;
 import org.springdoc.core.customizers.OperationCustomizer;
@@ -54,7 +53,6 @@ import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortT
 import org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties;
 import org.springframework.boot.actuate.endpoint.web.reactive.ControllerEndpointHandlerMapping;
 import org.springframework.boot.actuate.endpoint.web.reactive.WebFluxEndpointHandlerMapping;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -77,7 +75,6 @@ import static org.springdoc.core.Constants.SPRINGDOC_USE_MANAGEMENT_PORT;
 @Configuration(proxyBeanMethods = false)
 @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
 @ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
-@ConditionalOnBean(SpringDocConfiguration.class)
 public class SpringDocWebFluxConfiguration {
 
 	/**
diff --git a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/core/MultipleOpenApiSupportConfiguration.java b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/core/MultipleOpenApiSupportConfiguration.java
index 8b3de6f82..2e62c68f6 100644
--- a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/core/MultipleOpenApiSupportConfiguration.java
+++ b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/core/MultipleOpenApiSupportConfiguration.java
@@ -31,7 +31,6 @@ import org.springdoc.core.MultipleOpenApiSupportCondition;
 import org.springdoc.core.OpenAPIService;
 import org.springdoc.core.OperationService;
 import org.springdoc.core.SpringDocConfigProperties;
-import org.springdoc.core.SpringDocConfiguration;
 import org.springdoc.core.SpringDocProviders;
 import org.springdoc.webmvc.api.MultipleOpenApiActuatorResource;
 import org.springdoc.webmvc.api.MultipleOpenApiWebMvcResource;
@@ -40,7 +39,6 @@ import org.springframework.beans.factory.ObjectFactory;
 import org.springframework.boot.actuate.autoconfigure.web.server.ConditionalOnManagementPort;
 import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
 import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -63,7 +61,6 @@ import static org.springdoc.core.Constants.SPRINGDOC_USE_MANAGEMENT_PORT;
 @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
 @ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
 @Conditional(MultipleOpenApiSupportCondition.class)
-@ConditionalOnBean(SpringDocConfiguration.class)
 public class MultipleOpenApiSupportConfiguration {
 
 	/**
diff --git a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/core/SpringDocWebMvcConfiguration.java b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/core/SpringDocWebMvcConfiguration.java
index b76bbb7ea..4121bc358 100644
--- a/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/core/SpringDocWebMvcConfiguration.java
+++ b/springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/core/SpringDocWebMvcConfiguration.java
@@ -34,7 +34,6 @@ import org.springdoc.core.PropertyResolverUtils;
 import org.springdoc.core.RequestBodyService;
 import org.springdoc.core.ReturnTypeParser;
 import org.springdoc.core.SpringDocConfigProperties;
-import org.springdoc.core.SpringDocConfiguration;
 import org.springdoc.core.SpringDocProviders;
 import org.springdoc.core.customizers.OpenApiCustomiser;
 import org.springdoc.core.customizers.OperationCustomizer;
@@ -52,7 +51,6 @@ import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortT
 import org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties;
 import org.springframework.boot.actuate.endpoint.web.servlet.ControllerEndpointHandlerMapping;
 import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -79,7 +77,6 @@ import static org.springdoc.core.SpringDocUtils.getConfig;
 @Configuration(proxyBeanMethods = false)
 @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
 @ConditionalOnProperty(name = SPRINGDOC_ENABLED, matchIfMissing = true)
-@ConditionalOnBean(SpringDocConfiguration.class)
 public class SpringDocWebMvcConfiguration {
 
 	static {


Test patch:
diff --git a/springdoc-openapi-common/src/test/java/org/springdoc/api/AbstractOpenApiResourceTest.java b/springdoc-openapi-common/src/test/java/org/springdoc/api/AbstractOpenApiResourceTest.java
index 5c231e93e..f2059ab07 100644
--- a/springdoc-openapi-common/src/test/java/org/springdoc/api/AbstractOpenApiResourceTest.java
+++ b/springdoc-openapi-common/src/test/java/org/springdoc/api/AbstractOpenApiResourceTest.java
@@ -70,7 +70,6 @@ import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.nullValue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doCallRealMethod;
 import static org.mockito.Mockito.when;
 import static org.springframework.web.bind.annotation.RequestMethod.GET;
 
@@ -123,6 +122,7 @@ class AbstractOpenApiResourceTest {
 		when(openAPIService.build(any())).thenReturn(openAPI);
 
 		when(openAPIBuilderObjectFactory.getObject()).thenReturn(openAPIService);
+		when(springDocProviders.jsonMapper()).thenReturn(Json.mapper());
 	}
 
 	@Test
@@ -186,7 +186,7 @@ class AbstractOpenApiResourceTest {
 
 	@Test
 	void preLoadingModeShouldNotOverwriteServers() throws InterruptedException {
-		doCallRealMethod().when(openAPIService).updateServers(any());
+		when(openAPIService.updateServers(any())).thenCallRealMethod();
 		when(openAPIService.getCachedOpenAPI(any())).thenCallRealMethod();
 		doAnswer(new CallsRealMethods()).when(openAPIService).setServersPresent(true);
 		doAnswer(new CallsRealMethods()).when(openAPIService).setServerBaseUrl(any());
@@ -224,7 +224,7 @@ class AbstractOpenApiResourceTest {
 
 	@Test
 	void serverBaseUrlCustomisersTest() throws InterruptedException {
-		doCallRealMethod().when(openAPIService).updateServers(any());
+		when(openAPIService.updateServers(any())).thenCallRealMethod();
 		when(openAPIService.getCachedOpenAPI(any())).thenCallRealMethod();
 		doAnswer(new CallsRealMethods()).when(openAPIService).setServerBaseUrl(any());
 		doAnswer(new CallsRealMethods()).when(openAPIService).setCachedOpenAPI(any(), any());
diff --git a/springdoc-openapi-data-rest/src/test/java/test/org/springdoc/api/app14/SpringDocApp14Test.java b/springdoc-openapi-data-rest/src/test/java/test/org/springdoc/api/app14/SpringDocApp14Test.java
index 820ebba65..42f34a86e 100644
--- a/springdoc-openapi-data-rest/src/test/java/test/org/springdoc/api/app14/SpringDocApp14Test.java
+++ b/springdoc-openapi-data-rest/src/test/java/test/org/springdoc/api/app14/SpringDocApp14Test.java
@@ -43,8 +43,6 @@ import org.springframework.test.context.TestPropertySource;
 @TestPropertySource(properties = { "spring.data.web.pageable.default-page-size=25",
 		"spring.data.web.pageable.page-parameter=pages",
 		"spring.data.web.pageable.size-parameter=sizes",
-		"spring.data.web.pageable.one-indexed-parameters=true",
-		"spring.data.web.pageable.prefix=prefix_",
 		"spring.data.web.sort.sort-parameter=sorts" })
 @EnableAutoConfiguration(exclude = {
 		RepositoryRestMvcAutoConfiguration.class, SpringDocDataRestConfiguration.class
diff --git a/springdoc-openapi-data-rest/src/test/resources/results/app14.json b/springdoc-openapi-data-rest/src/test/resources/results/app14.json
index 3d6acde40..721adbfc0 100644
--- a/springdoc-openapi-data-rest/src/test/resources/results/app14.json
+++ b/springdoc-openapi-data-rest/src/test/resources/results/app14.json
@@ -19,18 +19,18 @@
         "operationId": "getAllPets",
         "parameters": [
           {
-            "name": "prefix_pages",
+            "name": "pages",
             "in": "query",
-            "description": "One-based page index (1..N)",
+            "description": "Zero-based page index (0..N)",
             "required": false,
             "schema": {
               "minimum": 0,
               "type": "integer",
-              "default": 1
+              "default": 0
             }
           },
           {
-            "name": "prefix_sizes",
+            "name": "sizes",
             "in": "query",
             "description": "The size of the page to be returned",
             "required": false,
@@ -97,4 +97,4 @@
       }
     }
   }
-}
\ No newline at end of file
+}
diff --git a/springdoc-openapi-javadoc/src/test/resources/results/app105-3.json b/springdoc-openapi-javadoc/src/test/resources/results/app105-3.json
index c4aaac278..af369b7c5 100644
--- a/springdoc-openapi-javadoc/src/test/resources/results/app105-3.json
+++ b/springdoc-openapi-javadoc/src/test/resources/results/app105-3.json
@@ -473,6 +473,15 @@
               "type": "integer",
               "format": "int64"
             }
+          },
+          {
+            "name": "additionalMetadata",
+            "in": "query",
+            "description": "Additional data to pass to server",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
           }
         ],
         "requestBody": {
@@ -485,9 +494,6 @@
                 ],
                 "type": "object",
                 "properties": {
-                  "additionalMetadata": {
-                    "description": "Additional data to pass to server"
-                  },
                   "file": {
                     "type": "string",
                     "description": "file detail",
@@ -645,4 +651,4 @@
       }
     }
   }
-}
+}
\ No newline at end of file
diff --git a/springdoc-openapi-javadoc/src/test/resources/results/app2.json b/springdoc-openapi-javadoc/src/test/resources/results/app2.json
index f4d90017b..e63263ee8 100644
--- a/springdoc-openapi-javadoc/src/test/resources/results/app2.json
+++ b/springdoc-openapi-javadoc/src/test/resources/results/app2.json
@@ -220,11 +220,11 @@
               }
             }
           },
-          "404": {
-            "description": "Pet not found"
-          },
           "405": {
             "description": "Validation exception"
+          },
+          "404": {
+            "description": "Pet not found"
           }
         },
         "security": [
@@ -495,8 +495,8 @@
               }
             }
           },
-          "404": {
-            "description": "Pet not found",
+          "200": {
+            "description": "successful operation",
             "content": {
               "application/xml": {
                 "schema": {
@@ -510,8 +510,8 @@
               }
             }
           },
-          "200": {
-            "description": "successful operation",
+          "404": {
+            "description": "Pet not found",
             "content": {
               "application/xml": {
                 "schema": {
@@ -670,6 +670,15 @@
               "type": "integer",
               "format": "int64"
             }
+          },
+          {
+            "name": "additionalMetadata",
+            "in": "query",
+            "description": "Additional data to pass to server",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
           }
         ],
         "requestBody": {
@@ -686,9 +695,6 @@
                     "type": "string",
                     "description": "file detail",
                     "format": "binary"
-                  },
-                  "additionalMetadata": {
-                    "description": "Additional data to pass to server"
                   }
                 }
               }
@@ -854,8 +860,8 @@
               }
             }
           },
-          "404": {
-            "description": "Order not found",
+          "200": {
+            "description": "successful operation",
             "content": {
               "application/xml": {
                 "schema": {
@@ -869,8 +875,8 @@
               }
             }
           },
-          "200": {
-            "description": "successful operation",
+          "404": {
+            "description": "Order not found",
             "content": {
               "application/xml": {
                 "schema": {
@@ -1289,4 +1295,4 @@
       }
     }
   }
-}
+}
\ No newline at end of file
diff --git a/springdoc-openapi-javadoc/src/test/resources/results/app31.json b/springdoc-openapi-javadoc/src/test/resources/results/app31.json
index 64ca68948..28b984940 100644
--- a/springdoc-openapi-javadoc/src/test/resources/results/app31.json
+++ b/springdoc-openapi-javadoc/src/test/resources/results/app31.json
@@ -28,7 +28,7 @@
           {
             "name": "x-auth-token",
             "in": "header",
-            "description": "the authentication token provided after initially authenticating to the application",
+            "description": "the token",
             "required": true,
             "schema": {
               "type": "string",
@@ -38,7 +38,7 @@
           {
             "name": "url",
             "in": "query",
-            "description": "the URL to call with response data",
+            "description": "the url",
             "required": true,
             "schema": {
               "type": "string",
@@ -108,4 +108,4 @@
       }
     }
   }
-}
+}
\ No newline at end of file
diff --git a/springdoc-openapi-ui/src/test/java/test/org/springdoc/ui/app1/SpringDocSwaggerConfigTest.java b/springdoc-openapi-ui/src/test/java/test/org/springdoc/ui/app1/SpringDocSwaggerConfigTest.java
index 1dd149337..3ec16fc21 100644
--- a/springdoc-openapi-ui/src/test/java/test/org/springdoc/ui/app1/SpringDocSwaggerConfigTest.java
+++ b/springdoc-openapi-ui/src/test/java/test/org/springdoc/ui/app1/SpringDocSwaggerConfigTest.java
@@ -33,7 +33,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
 		properties = {"spring.jackson.property-naming-strategy=UPPER_CAMEL_CASE", "springdoc.show-actuator=true",
 				"management.endpoints.web.base-path=/management",
-				"server.servlet.context-path=/demo/api", "management.server.port=9002", "management.server.base-path=/demo/api" })
+				"server.servlet.context-path=/demo/api", "management.server.port=9001", "management.server.base-path=/demo/api" })
 public class SpringDocSwaggerConfigTest  extends AbstractSpringDocActuatorTest {
 
 	@Test
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app14/SpringDocApp14Test.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app14/SpringDocApp14Test.java
index 474a3f66e..0a5c35e14 100644
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app14/SpringDocApp14Test.java
+++ b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app14/SpringDocApp14Test.java
@@ -22,9 +22,6 @@
 
 package test.org.springdoc.api.v30.app14;
 
-import java.util.Locale;
-
-import org.junit.jupiter.api.Test;
 import test.org.springdoc.api.v30.AbstractSpringDocV30Test;
 
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -33,10 +30,4 @@ public class SpringDocApp14Test extends AbstractSpringDocV30Test {
 
 	@SpringBootApplication
 	static class SpringDocTestApp {}
-
-	@Test
-	public void testApp() throws Exception {
-		Locale.setDefault(Locale.US);
-		super.testApp();
-	}
 }
\ No newline at end of file
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app145/SpringDocApp145Test.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app145/SpringDocApp145Test.java
index 89d04e712..ea8001f88 100644
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app145/SpringDocApp145Test.java
+++ b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app145/SpringDocApp145Test.java
@@ -88,7 +88,7 @@ public class SpringDocApp145Test extends AbstractSpringDocActuatorV30Test {
 		}
 		catch (HttpStatusCodeException ex) {
 			// TODO: Currently obtain status 500 on MVC... Webflux obtain 404... 
-			if (ex.getStatusCode() == HttpStatus.NOT_FOUND)
+			if (ex.getStatusCode() == HttpStatus.INTERNAL_SERVER_ERROR)
 				assertTrue(true);
 			else
 				fail();
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app148/SpringDocApp148Test.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app148/SpringDocApp148Test.java
index a7ca6cccb..e31cc212b 100644
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app148/SpringDocApp148Test.java
+++ b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app148/SpringDocApp148Test.java
@@ -76,7 +76,7 @@ public class SpringDocApp148Test extends AbstractSpringDocActuatorV30Test {
 		}
 		catch (HttpStatusCodeException ex) {
 			// TODO: Currently obtain status 500 on MVC... Webflux obtain 404... 
-			if (ex.getStatusCode() == HttpStatus.NOT_FOUND)
+			if (ex.getStatusCode() == HttpStatus.INTERNAL_SERVER_ERROR)
 				assertTrue(true);
 			else
 				fail();
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app189/ArticleApi.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app189/ArticleApi.java
deleted file mode 100644
index dd151d746..000000000
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app189/ArticleApi.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package test.org.springdoc.api.v30.app189;
-
-import java.util.LinkedList;
-import java.util.List;
-
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springdoc.api.annotations.ParameterObject;
-
-import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestPart;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.multipart.MultipartFile;
-
-@Tag(name = "Article Api")
-@RestController("/article")
-public class ArticleApi {
-
-    @GetMapping("query")
-    public List<ArticleDto> query(@ParameterObject ArticleQueryCondition condition) {
-        return new LinkedList<>();
-    }
-
-    @PostMapping(value = "create", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
-    public ArticleDto create(@ParameterObject ArticleDto dto, @RequestPart MultipartFile file) {
-        return new ArticleDto();
-    }
-}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app189/ArticleDto.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app189/ArticleDto.java
deleted file mode 100644
index 87f2614be..000000000
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app189/ArticleDto.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package test.org.springdoc.api.v30.app189;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-@Schema
-public class ArticleDto {
-    @Schema(description = "title")
-    private String title;
-
-    @Schema(description = "content")
-    private String content;
-
-    public String getTitle() {
-        return title;
-    }
-
-    public void setTitle(String title) {
-        this.title = title;
-    }
-
-    public String getContent() {
-        return content;
-    }
-
-    public void setContent(String content) {
-        this.content = content;
-    }
-}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app189/ArticleQueryCondition.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app189/ArticleQueryCondition.java
deleted file mode 100644
index c712081c8..000000000
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app189/ArticleQueryCondition.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package test.org.springdoc.api.v30.app189;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-@Schema
-public class ArticleQueryCondition {
-    @Schema(description = "title")
-    private String title;
-
-    public String getTitle() {
-        return title;
-    }
-
-    public void setTitle(String title) {
-        this.title = title;
-    }
-}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/ConcreteSubclassFromGeneric.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/ConcreteSubclassFromGeneric.java
new file mode 100644
index 000000000..2bf7f5c34
--- /dev/null
+++ b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/ConcreteSubclassFromGeneric.java
@@ -0,0 +1,9 @@
+package test.org.springdoc.api.v30.app190;
+
+public class ConcreteSubclassFromGeneric extends SimpleGeneric<MyData> {
+    private String topName;
+
+    public String getTopName() {
+        return topName;
+    }
+}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/HelloController.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/HelloController.java
new file mode 100644
index 000000000..c7ab7d09f
--- /dev/null
+++ b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/HelloController.java
@@ -0,0 +1,48 @@
+/*
+ *
+ *  *
+ *  *  *
+ *  *  *  * 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 test.org.springdoc.api.v30.app190;
+
+
+import org.springdoc.api.annotations.ParameterObject;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class HelloController {
+	@GetMapping("/nested")
+	public ResponseEntity<String> nested(@ParameterObject final SimpleOuterClass filter) {
+		return new ResponseEntity<>("{\"Say\": \"Hello\"}", HttpStatus.OK);
+	}
+
+	@GetMapping( "/nestedTypeErasureGeneric")
+	public ResponseEntity<String> nestedTypeErasureGeneric( @ParameterObject final SimpleGeneric<MyData> filter) {
+		return new ResponseEntity<>("{\"Say\": \"Hello\"}", HttpStatus.OK);
+	}
+
+	@GetMapping( "/nestedReifiableGeneric")
+	public ResponseEntity<String> nestedReifiableGeneric( @ParameterObject final ConcreteSubclassFromGeneric filter) {
+		return new ResponseEntity<>("{\"Say\": \"Hello\"}", HttpStatus.OK);
+	}
+}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/MyData.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/MyData.java
new file mode 100644
index 000000000..d24ec946c
--- /dev/null
+++ b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/MyData.java
@@ -0,0 +1,14 @@
+package test.org.springdoc.api.v30.app190;
+
+public class MyData {
+    private String firstName;
+    private Integer maxNumber;
+
+    public Integer getMaxNumber() {
+        return maxNumber;
+    }
+
+    public String getFirstName() {
+        return firstName;
+    }
+}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/SimpleGeneric.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/SimpleGeneric.java
new file mode 100644
index 000000000..1a3bedf34
--- /dev/null
+++ b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/SimpleGeneric.java
@@ -0,0 +1,15 @@
+package test.org.springdoc.api.v30.app190;
+
+public class SimpleGeneric<T> {
+
+    private String name;
+    private T child;
+
+    public T getChild() {
+        return child;
+    }
+
+    public String getName() {
+        return name;
+    }
+}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/SimpleInnerClass.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/SimpleInnerClass.java
new file mode 100644
index 000000000..c58497d4d
--- /dev/null
+++ b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/SimpleInnerClass.java
@@ -0,0 +1,21 @@
+package test.org.springdoc.api.v30.app190;
+
+public class SimpleInnerClass {
+
+    private SimpleInnerInnerClass innerInnerClass;
+
+    private Boolean name;
+    private Integer maxNumber;
+
+    public Integer getMaxNumber() {
+        return maxNumber;
+    }
+
+    public Boolean getName() {
+        return name;
+    }
+
+    public SimpleInnerInnerClass getInnerInnerClass() {
+        return innerInnerClass;
+    }
+}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/SimpleInnerInnerClass.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/SimpleInnerInnerClass.java
new file mode 100644
index 000000000..cd1faabfb
--- /dev/null
+++ b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/SimpleInnerInnerClass.java
@@ -0,0 +1,15 @@
+package test.org.springdoc.api.v30.app190;
+
+public class SimpleInnerInnerClass {
+
+    Boolean name;
+    private Integer maxNumber;
+
+    public Integer getMaxNumber() {
+        return maxNumber;
+    }
+
+    public Boolean getName() {
+        return name;
+    }
+}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/SimpleOuterClass.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/SimpleOuterClass.java
new file mode 100644
index 000000000..30a2b5c35
--- /dev/null
+++ b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/SimpleOuterClass.java
@@ -0,0 +1,14 @@
+package test.org.springdoc.api.v30.app190;
+
+public class SimpleOuterClass {
+    private String name;
+    private SimpleInnerClass innerClass;
+
+    public String getName() {
+        return name;
+    }
+
+    public SimpleInnerClass getInnerClass() {
+        return innerClass;
+    }
+}
diff --git a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app189/SpringDocApp189Test.java b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/SpringDocApp190Test.java
similarity index 89%
rename from springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app189/SpringDocApp189Test.java
rename to springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/SpringDocApp190Test.java
index bd110de54..08583094a 100644
--- a/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app189/SpringDocApp189Test.java
+++ b/springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app190/SpringDocApp190Test.java
@@ -20,15 +20,14 @@
  *
  */
 
-package test.org.springdoc.api.v30.app189;
-
-import test.org.springdoc.api.v30.AbstractSpringDocV30Test;
+package test.org.springdoc.api.v30.app190;
 
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import test.org.springdoc.api.v30.AbstractSpringDocV30Test;
 
-public class SpringDocApp189Test extends AbstractSpringDocV30Test {
+public class SpringDocApp190Test extends AbstractSpringDocV30Test {
 
     @SpringBootApplication
     static class SpringDocTestApp {}
 
-}
\ No newline at end of file
+}
diff --git a/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app105-3.json b/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app105-3.json
index 313a15776..46c8d05e1 100644
--- a/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app105-3.json
+++ b/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app105-3.json
@@ -126,6 +126,142 @@
         ]
       }
     },
+    "/pet/findByStatus": {
+      "get": {
+        "tags": [
+          "pet"
+        ],
+        "summary": "Finds Pets by status",
+        "description": "Multiple status values can be provided with comma separated strings",
+        "operationId": "findPetsByStatus",
+        "parameters": [
+          {
+            "name": "status",
+            "in": "query",
+            "description": "Status values that need to be considered for filter",
+            "required": true,
+            "schema": {
+              "type": "array",
+              "items": {
+                "type": "string"
+              }
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "successful operation",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/Pet"
+                  }
+                }
+              },
+              "application/xml": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/Pet"
+                  }
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Invalid status value",
+            "content": {
+              "*/*": {
+                "schema": {
+                  "type": "object",
+                  "additionalProperties": {
+                    "type": "object"
+                  }
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "petstore_auth": [
+              "write:pets",
+              "read:pets"
+            ]
+          }
+        ]
+      }
+    },
+    "/pet/findByTags": {
+      "get": {
+        "tags": [
+          "pet"
+        ],
+        "summary": "Finds Pets by tags",
+        "description": "Muliple tags can be provided with comma separated strings. Use         tag1, tag2, tag3 for testing.",
+        "operationId": "findPetsByTags",
+        "parameters": [
+          {
+            "name": "tags",
+            "in": "query",
+            "description": "Tags to filter by",
+            "required": true,
+            "schema": {
+              "type": "array",
+              "items": {
+                "type": "string"
+              }
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "successful operation",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/Pet"
+                  }
+                }
+              },
+              "application/xml": {
+                "schema": {
+                  "type": "array",
+                  "items": {
+                    "$ref": "#/components/schemas/Pet"
+                  }
+                }
+              }
+            }
+          },
+          "400": {
+            "description": "Invalid tag value",
+            "content": {
+              "*/*": {
+                "schema": {
+                  "type": "object",
+                  "additionalProperties": {
+                    "type": "object"
+                  }
+                }
+              }
+            }
+          }
+        },
+        "security": [
+          {
+            "petstore_auth": [
+              "write:pets",
+              "read:pets"
+            ]
+          }
+        ]
+      }
+    },
     "/pet/{petId}": {
       "get": {
         "tags": [
@@ -147,6 +283,21 @@
           }
         ],
         "responses": {
+          "200": {
+            "description": "successful operation",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/Pet"
+                }
+              },
+              "application/xml": {
+                "schema": {
+                  "$ref": "#/components/schemas/Pet"
+                }
+              }
+            }
+          },
           "400": {
             "description": "Invalid ID supplied",
             "content": {
@@ -163,27 +314,12 @@
           "404": {
             "description": "Pet not found",
             "content": {
-              "application/xml": {
-                "schema": {
-                  "$ref": "#/components/schemas/Pet"
-                }
-              },
               "application/json": {
                 "schema": {
                   "$ref": "#/components/schemas/Pet"
                 }
-              }
-            }
-          },
-          "200": {
-            "description": "successful operation",
-            "content": {
-              "application/xml": {
-                "schema": {
-                  "$ref": "#/components/schemas/Pet"
-                }
               },
-              "application/json": {
+              "application/xml": {
                 "schema": {
                   "$ref": "#/components/schemas/Pet"
                 }
@@ -331,6 +467,15 @@
               "type": "integer",
               "format": "int64"
             }
+          },
+          {
+            "name": "additionalMetadata",
+            "in": "query",
+            "description": "Additional data to pass to server",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
           }
         ],
         "requestBody": {
@@ -346,9 +491,6 @@
                     "type": "string",
                     "description": "file detail",
                     "format": "binary"
-                  },
-                  "additionalMetadata": {
-                    "description": "Additional data to pass to server"
                   }
                 }
               }
@@ -356,19 +498,6 @@
           }
         },
         "responses": {
-          "400": {
-            "description": "Bad Request",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object",
-                  "additionalProperties": {
-                    "type": "object"
-                  }
-                }
-              }
-            }
-          },
           "200": {
             "description": "successful operation",
             "content": {
@@ -378,111 +507,9 @@
                 }
               }
             }
-          }
-        },
-        "security": [
-          {
-            "petstore_auth": [
-              "write:pets",
-              "read:pets"
-            ]
-          }
-        ]
-      }
-    },
-    "/pet/findByTags": {
-      "get": {
-        "tags": [
-          "pet"
-        ],
-        "summary": "Finds Pets by tags",
-        "description": "Muliple tags can be provided with comma separated strings. Use         tag1, tag2, tag3 for testing.",
-        "operationId": "findPetsByTags",
-        "parameters": [
-          {
-            "name": "tags",
-            "in": "query",
-            "description": "Tags to filter by",
-            "required": true,
-            "schema": {
-              "type": "array",
-              "items": {
-                "type": "string"
-              }
-            }
-          }
-        ],
-        "responses": {
-          "400": {
-            "description": "Invalid tag value",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "object",
-                  "additionalProperties": {
-                    "type": "object"
-                  }
-                }
-              }
-            }
           },
-          "200": {
-            "description": "successful operation",
-            "content": {
-              "application/xml": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/Pet"
-                  }
-                }
-              },
-              "application/json": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/Pet"
-                  }
-                }
-              }
-            }
-          }
-        },
-        "security": [
-          {
-            "petstore_auth": [
-              "write:pets",
-              "read:pets"
-            ]
-          }
-        ]
-      }
-    },
-    "/pet/findByStatus": {
-      "get": {
-        "tags": [
-          "pet"
-        ],
-        "summary": "Finds Pets by status",
-        "description": "Multiple status values can be provided with comma separated strings",
-        "operationId": "findPetsByStatus",
-        "parameters": [
-          {
-            "name": "status",
-            "in": "query",
-            "description": "Status values that need to be considered for filter",
-            "required": true,
-            "schema": {
-              "type": "array",
-              "items": {
-                "type": "string"
-              }
-            }
-          }
-        ],
-        "responses": {
           "400": {
-            "description": "Invalid status value",
+            "description": "Bad Request",
             "content": {
               "*/*": {
                 "schema": {
@@ -493,27 +520,6 @@
                 }
               }
             }
-          },
-          "200": {
-            "description": "successful operation",
-            "content": {
-              "application/xml": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/Pet"
-                  }
-                }
-              },
-              "application/json": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/Pet"
-                  }
-                }
-              }
-            }
           }
         },
         "security": [
@@ -541,6 +547,21 @@
           }
         }
       },
+      "ModelApiResponse": {
+        "type": "object",
+        "properties": {
+          "code": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "message": {
+            "type": "string"
+          },
+          "type": {
+            "type": "string"
+          }
+        }
+      },
       "Pet": {
         "required": [
           "name",
@@ -548,13 +569,13 @@
         ],
         "type": "object",
         "properties": {
+          "category": {
+            "$ref": "#/components/schemas/Category"
+          },
           "id": {
             "type": "integer",
             "format": "int64"
           },
-          "category": {
-            "$ref": "#/components/schemas/Category"
-          },
           "name": {
             "type": "string",
             "example": "doggie"
@@ -565,12 +586,6 @@
               "type": "string"
             }
           },
-          "tags": {
-            "type": "array",
-            "items": {
-              "$ref": "#/components/schemas/Tag"
-            }
-          },
           "status": {
             "type": "string",
             "description": "pet status in the store",
@@ -579,6 +594,12 @@
               "pending",
               "sold"
             ]
+          },
+          "tags": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/Tag"
+            }
           }
         }
       },
@@ -593,21 +614,6 @@
             "type": "string"
           }
         }
-      },
-      "ModelApiResponse": {
-        "type": "object",
-        "properties": {
-          "code": {
-            "type": "integer",
-            "format": "int32"
-          },
-          "type": {
-            "type": "string"
-          },
-          "message": {
-            "type": "string"
-          }
-        }
       }
     },
     "securitySchemes": {
@@ -621,8 +627,8 @@
           "implicit": {
             "authorizationUrl": "http://petstore.swagger.io/oauth/dialog",
             "scopes": {
-              "write:pets": "modify pets in your account",
-              "read:pets": "read your pets"
+              "read:pets": "read your pets",
+              "write:pets": "modify pets in your account"
             }
           }
         }
diff --git a/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app138.json b/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app138.json
index 7b757b5eb..b5c657b22 100644
--- a/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app138.json
+++ b/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app138.json
@@ -1,1 +1,1 @@
-{"openapi":"3.0.1","info":{"title":"OpenAPI definition","version":"v0"},"servers":[{"description":"Generated server url","url":"http://localhost"}],"paths":{"/testA":{"get":{"operationId":"testA","parameters":[{"in":"query","name":"hello","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}},"tags":["hello-controller"]}},"/testB":{"get":{"operationId":"testB","parameters":[{"in":"query","name":"hello","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}},"tags":["hello-controller"]}}},"components":{},"x-my-vendor-extensions":{"property1":"value1","property2":null}}
\ No newline at end of file
+{"openapi":"3.0.1","info":{"title":"OpenAPI definition","version":"v0"},"servers":[{"url":"http://localhost","description":"Generated server url"}],"paths":{"/testA":{"get":{"operationId":"testA","parameters":[{"in":"query","name":"hello","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}},"tags":["hello-controller"]}},"/testB":{"get":{"operationId":"testB","parameters":[{"in":"query","name":"hello","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}},"tags":["hello-controller"]}}},"components":{},"x-my-vendor-extensions":{"property1":"value1","property2":null}}
\ No newline at end of file
diff --git a/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app189.json b/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app189.json
deleted file mode 100644
index e4a831798..000000000
--- a/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app189.json
+++ /dev/null
@@ -1,111 +0,0 @@
-{
-  "openapi": "3.0.1",
-  "info": {
-    "title": "OpenAPI definition",
-    "version": "v0"
-  },
-  "servers": [
-    {
-      "url": "http://localhost",
-      "description": "Generated server url"
-    }
-  ],
-  "paths": {
-    "/create": {
-      "post": {
-        "tags": [
-          "Article Api"
-        ],
-        "operationId": "create",
-        "requestBody": {
-          "content": {
-            "multipart/form-data": {
-              "schema": {
-                "required": [
-                  "file"
-                ],
-                "type": "object",
-                "properties": {
-                  "file": {
-                    "type": "string",
-                    "format": "binary"
-                  },
-                  "title": {
-                    "description": "title"
-                  },
-                  "content": {
-                    "description": "content"
-                  }
-                }
-              }
-            }
-          }
-        },
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "$ref": "#/components/schemas/ArticleDto"
-                }
-              }
-            }
-          }
-        }
-      }
-    },
-    "/query": {
-      "get": {
-        "tags": [
-          "Article Api"
-        ],
-        "operationId": "query",
-        "parameters": [
-          {
-            "name": "title",
-            "in": "query",
-            "description": "title",
-            "required": false,
-            "schema": {
-              "type": "string",
-              "description": "title"
-            }
-          }
-        ],
-        "responses": {
-          "200": {
-            "description": "OK",
-            "content": {
-              "*/*": {
-                "schema": {
-                  "type": "array",
-                  "items": {
-                    "$ref": "#/components/schemas/ArticleDto"
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  },
-  "components": {
-    "schemas": {
-      "ArticleDto": {
-        "type": "object",
-        "properties": {
-          "title": {
-            "type": "string",
-            "description": "title"
-          },
-          "content": {
-            "type": "string",
-            "description": "content"
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app190.json b/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app190.json
new file mode 100644
index 000000000..f007f9d0a
--- /dev/null
+++ b/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app190.json
@@ -0,0 +1,165 @@
+{
+  "openapi": "3.0.1",
+  "info": {
+    "title": "OpenAPI definition",
+    "version": "v0"
+  },
+  "servers": [
+    {
+      "url": "http://localhost",
+      "description": "Generated server url"
+    }
+  ],
+  "paths": {
+    "/nested": {
+      "get": {
+        "tags": [
+          "hello-controller"
+        ],
+        "operationId": "nested",
+        "parameters": [
+          {
+            "name": "name",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "name": "innerClass.innerInnerClass.name",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "boolean"
+            }
+          },
+          {
+            "name": "innerClass.innerInnerClass.maxNumber",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int32"
+            }
+          },
+          {
+            "name": "innerClass.name",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "boolean"
+            }
+          },
+          {
+            "name": "innerClass.maxNumber",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int32"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "*/*": {
+                "schema": {
+                  "type": "string"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/nestedTypeErasureGeneric": {
+      "get": {
+        "tags": [
+          "hello-controller"
+        ],
+        "operationId": "nestedTypeErasureGeneric",
+        "parameters": [
+          {
+            "name": "name",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "*/*": {
+                "schema": {
+                  "type": "string"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/nestedReifiableGeneric": {
+      "get": {
+        "tags": [
+          "hello-controller"
+        ],
+        "operationId": "nestedReifiableGeneric",
+        "parameters": [
+          {
+            "name": "topName",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "name": "name",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "name": "child.firstName",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
+          },
+          {
+            "name": "child.maxNumber",
+            "in": "query",
+            "required": false,
+            "schema": {
+              "type": "integer",
+              "format": "int32"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "OK",
+            "content": {
+              "*/*": {
+                "schema": {
+                  "type": "string"
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  },
+  "components": {}
+}
diff --git a/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app2.json b/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app2.json
index a72d7aefa..0827ed6dd 100644
--- a/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app2.json
+++ b/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app2.json
@@ -215,11 +215,11 @@
               }
             }
           },
-          "404": {
-            "description": "Pet not found"
-          },
           "405": {
             "description": "Validation exception"
+          },
+          "404": {
+            "description": "Pet not found"
           }
         },
         "security": [
@@ -484,8 +484,8 @@
               }
             }
           },
-          "404": {
-            "description": "Pet not found",
+          "200": {
+            "description": "successful operation",
             "content": {
               "application/xml": {
                 "schema": {
@@ -499,8 +499,8 @@
               }
             }
           },
-          "200": {
-            "description": "successful operation",
+          "404": {
+            "description": "Pet not found",
             "content": {
               "application/xml": {
                 "schema": {
@@ -655,6 +655,15 @@
               "type": "integer",
               "format": "int64"
             }
+          },
+          {
+            "name": "additionalMetadata",
+            "in": "query",
+            "description": "Additional data to pass to server",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
           }
         ],
         "requestBody": {
@@ -670,9 +679,6 @@
                     "type": "string",
                     "description": "file detail",
                     "format": "binary"
-                  },
-                  "additionalMetadata": {
-                    "description": "Additional data to pass to server"
                   }
                 }
               }
diff --git a/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app31.json b/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app31.json
index 691b9ff1e..efdf98d39 100644
--- a/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app31.json
+++ b/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app31.json
@@ -22,7 +22,6 @@
           {
             "name": "x-auth-token",
             "in": "header",
-            "description": "the authentication token provided after initially authenticating to the application",
             "required": true,
             "schema": {
               "type": "string",
@@ -32,7 +31,6 @@
           {
             "name": "url",
             "in": "query",
-            "description": "the URL to call with response data",
             "required": true,
             "schema": {
               "type": "string",
diff --git a/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app68-3.json b/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app68-3.json
index 619dfb2a9..b78e1c5c1 100644
--- a/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app68-3.json
+++ b/springdoc-openapi-webmvc-core/src/test/resources/results/3.0.1/app68-3.json
@@ -60,11 +60,11 @@
               }
             }
           },
-          "404": {
-            "description": "Pet not found"
-          },
           "405": {
             "description": "Validation exception"
+          },
+          "404": {
+            "description": "Pet not found"
           }
         },
         "security": [
@@ -160,8 +160,8 @@
               }
             }
           },
-          "404": {
-            "description": "Pet not found",
+          "200": {
+            "description": "successful operation",
             "content": {
               "application/xml": {
                 "schema": {
@@ -175,8 +175,8 @@
               }
             }
           },
-          "200": {
-            "description": "successful operation",
+          "404": {
+            "description": "Pet not found",
             "content": {
               "application/xml": {
                 "schema": {
@@ -331,6 +331,15 @@
               "type": "integer",
               "format": "int64"
             }
+          },
+          {
+            "name": "additionalMetadata",
+            "in": "query",
+            "description": "Additional data to pass to server",
+            "required": false,
+            "schema": {
+              "type": "string"
+            }
           }
         ],
         "requestBody": {
@@ -346,9 +355,6 @@
                     "type": "string",
                     "description": "file detail",
                     "format": "binary"
-                  },
-                  "additionalMetadata": {
-                    "description": "Additional data to pass to server"
                   }
                 }
               }
diff --git a/springdoc-openapi-webmvc-core/src/test/resources/results/3.1.0/app2.json b/springdoc-openapi-webmvc-core/src/test/resources/results/3.1.0/app2.json
index 811f65ce1..158c799fa 100644
--- a/springdoc-openapi-webmvc-core/src/test/resources/results/3.1.0/app2.json
+++ b/springdoc-openapi-webmvc-core/src/test/resources/results/3.1.0/app2.json
@@ -445,8 +445,8 @@
               }
             }
           },
-          "200": {
-            "description": "successful operation",
+          "404": {
+            "description": "Pet not found",
             "content": {
               "application/xml": {
                 "schema": {
@@ -460,8 +460,8 @@
               }
             }
           },
-          "404": {
-            "description": "Pet not found",
+          "200": {
+            "description": "successful operation",
             "content": {
               "application/xml": {
                 "schema": {
@@ -601,6 +601,13 @@
             "schema": {
               "format": "int64"
             }
+          },
+          {
+            "name": "additionalMetadata",
+            "in": "query",
+            "description": "Additional data to pass to server",
+            "required": false,
+            "schema": {}
           }
         ],
         "requestBody": {
@@ -611,9 +618,6 @@
                   "file": {
                     "format": "binary",
                     "description": "file detail"
-                  },
-                  "additionalMetadata": {
-                    "description": "Additional data to pass to server"
                   }
                 },
                 "required": [