Skip to content

Commit 0489d29

Browse files
committed
Merge branch 'NaccOll-default-flat-object'
2 parents fb02518 + f5d44a8 commit 0489d29

File tree

6 files changed

+68
-4
lines changed

6 files changed

+68
-4
lines changed

springdoc-openapi-common/src/main/java/org/springdoc/core/AbstractRequestService.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,11 @@ public abstract class AbstractRequestService {
166166
*/
167167
private final Optional<List<ParameterCustomizer>> parameterCustomizers;
168168

169+
/**
170+
* The Default flat param object.
171+
*/
172+
private final boolean defaultFlatParamObject;
173+
169174
/**
170175
* Instantiates a new Abstract request builder.
171176
*
@@ -185,6 +190,7 @@ protected AbstractRequestService(GenericParameterService parameterBuilder, Reque
185190
parameterCustomizers.ifPresent(customizers -> customizers.removeIf(Objects::isNull));
186191
this.parameterCustomizers = parameterCustomizers;
187192
this.localSpringDocParameterNameDiscoverer = localSpringDocParameterNameDiscoverer;
193+
this.defaultFlatParamObject = parameterBuilder.getPropertyResolverUtils().getSpringDocConfigProperties().isDefaultFlatParamObject();
188194
}
189195

190196
/**
@@ -239,7 +245,7 @@ public Operation build(HandlerMethod handlerMethod, RequestMethod requestMethod,
239245
String[] reflectionParametersNames = Arrays.stream(handlerMethod.getMethod().getParameters()).map(java.lang.reflect.Parameter::getName).toArray(String[]::new);
240246
if (pNames == null || Arrays.stream(pNames).anyMatch(Objects::isNull))
241247
pNames = reflectionParametersNames;
242-
parameters = DelegatingMethodParameter.customize(pNames, parameters, parameterBuilder.getDelegatingMethodParameterCustomizer());
248+
parameters = DelegatingMethodParameter.customize(pNames, parameters, parameterBuilder.getDelegatingMethodParameterCustomizer(), this.defaultFlatParamObject);
243249
RequestBodyInfo requestBodyInfo = new RequestBodyInfo();
244250
List<Parameter> operationParameters = (operation.getParameters() != null) ? operation.getParameters() : new ArrayList<>();
245251
Map<String, io.swagger.v3.oas.annotations.Parameter> parametersDocMap = getApiParameters(handlerMethod.getMethod());
@@ -740,4 +746,12 @@ private String getParamJavadoc(JavadocProvider javadocProvider, MethodParameter
740746
return paramJavadocDescription;
741747
}
742748

749+
/**
750+
* Is default flat param object boolean.
751+
*
752+
* @return the boolean
753+
*/
754+
public boolean isDefaultFlatParamObject() {
755+
return defaultFlatParamObject;
756+
}
743757
}

springdoc-openapi-common/src/main/java/org/springdoc/core/DelegatingMethodParameter.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ public class DelegatingMethodParameter extends MethodParameter {
111111
* @param optionalDelegatingMethodParameterCustomizer the optional delegating method parameter customizer
112112
* @return the method parameter [ ]
113113
*/
114-
public static MethodParameter[] customize(String[] pNames, MethodParameter[] parameters, Optional<DelegatingMethodParameterCustomizer> optionalDelegatingMethodParameterCustomizer) {
114+
public static MethodParameter[] customize(String[] pNames, MethodParameter[] parameters,
115+
Optional<DelegatingMethodParameterCustomizer> optionalDelegatingMethodParameterCustomizer, boolean defaultFlatParamObject) {
115116
List<MethodParameter> explodedParameters = new ArrayList<>();
116117
for (int i = 0; i < parameters.length; ++i) {
117118
MethodParameter p = parameters[i];
@@ -123,6 +124,22 @@ public static MethodParameter[] customize(String[] pNames, MethodParameter[] par
123124
explodedParameters.add(methodParameter);
124125
});
125126
}
127+
else if (defaultFlatParamObject) {
128+
boolean isSimpleType = MethodParameterPojoExtractor.isSimpleType(paramClass);
129+
boolean hasAnnotation = p.hasParameterAnnotations();
130+
boolean shouldFlat = !isSimpleType && !hasAnnotation;
131+
if (shouldFlat && !AbstractRequestService.isRequestTypeToIgnore(paramClass)) {
132+
MethodParameterPojoExtractor.extractFrom(paramClass).forEach(methodParameter -> {
133+
optionalDelegatingMethodParameterCustomizer
134+
.ifPresent(customizer -> customizer.customize(p, methodParameter));
135+
explodedParameters.add(methodParameter);
136+
});
137+
}
138+
else {
139+
String name = pNames != null ? pNames[i] : p.getParameterName();
140+
explodedParameters.add(new DelegatingMethodParameter(p, name, null, false, false));
141+
}
142+
}
126143
else {
127144
String name = pNames != null ? pNames[i] : p.getParameterName();
128145
explodedParameters.add(new DelegatingMethodParameter(p, name, null, false, false));
@@ -274,4 +291,4 @@ public static MethodParameter changeContainingClass(MethodParameter methodParame
274291
return result;
275292
}
276293

277-
}
294+
}

springdoc-openapi-common/src/main/java/org/springdoc/core/MethodParameterPojoExtractor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.lang.reflect.Field;
2929
import java.lang.reflect.Type;
3030
import java.lang.reflect.TypeVariable;
31+
import java.nio.charset.Charset;
3132
import java.time.Duration;
3233
import java.time.LocalTime;
3334
import java.util.ArrayList;
@@ -83,6 +84,7 @@ private MethodParameterPojoExtractor() {
8384
SIMPLE_TYPES.add(OptionalDouble.class);
8485
SIMPLE_TYPES.add(AtomicLong.class);
8586
SIMPLE_TYPES.add(AtomicInteger.class);
87+
SIMPLE_TYPES.add(Charset.class);
8688

8789
SIMPLE_TYPES.add(Map.class);
8890
SIMPLE_TYPES.add(Iterable.class);

springdoc-openapi-common/src/main/java/org/springdoc/core/PropertyResolverUtils.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,4 +207,13 @@ private void resolveProperty(Supplier<String> getProperty, Consumer<String> setP
207207
public ConfigurableBeanFactory getFactory() {
208208
return factory;
209209
}
210+
211+
/**
212+
* Gets spring doc config properties.
213+
*
214+
* @return the spring doc config properties
215+
*/
216+
public SpringDocConfigProperties getSpringDocConfigProperties() {
217+
return springDocConfigProperties;
218+
}
210219
}

springdoc-openapi-common/src/main/java/org/springdoc/core/SpringDocConfigProperties.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ public class SpringDocConfigProperties {
176176
*/
177177
private boolean showSpringCloudFunctions;
178178

179+
/**
180+
* The param default flatten
181+
*/
182+
private boolean defaultFlatParamObject;
183+
179184
/**
180185
* The model Converters
181186
*/
@@ -222,6 +227,23 @@ public void setShowSpringCloudFunctions(boolean showSpringCloudFunctions) {
222227
this.showSpringCloudFunctions = showSpringCloudFunctions;
223228
}
224229

230+
/**
231+
* Is default flat param object
232+
* @return the boolean
233+
*/
234+
public boolean isDefaultFlatParamObject() {
235+
return defaultFlatParamObject;
236+
}
237+
238+
/**
239+
* Sets default flat param object.
240+
*
241+
* @param defaultFlatParamObject the default flat param object
242+
*/
243+
public void setDefaultFlatParamObject(boolean defaultFlatParamObject) {
244+
this.defaultFlatParamObject = defaultFlatParamObject;
245+
}
246+
225247
/**
226248
* Gets model converters.
227249
*

springdoc-openapi-data-rest/src/main/java/org/springdoc/data/rest/core/DataRestRequestService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ public void buildParameters(OpenAPI openAPI, HandlerMethod handlerMethod, Reques
149149
*/
150150
public void buildCommonParameters(OpenAPI openAPI, RequestMethod requestMethod, MethodAttributes methodAttributes, Operation operation, String[] pNames, MethodParameter[] parameters,
151151
DataRestRepository dataRestRepository) {
152-
parameters = DelegatingMethodParameter.customize(pNames, parameters, parameterBuilder.getDelegatingMethodParameterCustomizer());
152+
parameters = DelegatingMethodParameter.customize(pNames, parameters, parameterBuilder.getDelegatingMethodParameterCustomizer(), requestBuilder.isDefaultFlatParamObject());
153153
Class<?> domainType = dataRestRepository.getDomainType();
154154
for (MethodParameter methodParameter : parameters) {
155155
final String pName = methodParameter.getParameterName();

0 commit comments

Comments
 (0)