Skip to content

Commit 2c86773

Browse files
committed
Wrong Parameter Name with Default Sort. Fixes #1010.
1 parent 01992fe commit 2c86773

File tree

5 files changed

+492
-22
lines changed

5 files changed

+492
-22
lines changed

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

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -265,23 +265,27 @@ private void setSchema(io.swagger.v3.oas.annotations.Parameter parameterDoc, Com
265265
Schema schema = null;
266266
try {
267267
schema = AnnotationsUtils.getSchema(parameterDoc.schema(), null, false, parameterDoc.schema().implementation(), components, jsonView).orElse(null);
268+
// Cast default value
269+
if (schema != null && schema.getDefault() != null) {
270+
PrimitiveType primitiveType = PrimitiveType.fromTypeAndFormat(schema.getType(), schema.getFormat());
271+
if (primitiveType != null) {
272+
Schema<?> primitiveSchema = primitiveType.createProperty();
273+
primitiveSchema.setDefault(schema.getDefault());
274+
schema.setDefault(primitiveSchema.getDefault());
275+
}
276+
}
268277
}
269278
catch (Exception e) {
270279
LOGGER.warn(Constants.GRACEFUL_EXCEPTION_OCCURRED, e);
271280
}
272281
if (schema == null) {
273282
schema = AnnotationsUtils.getArraySchema(parameterDoc.array(), components, jsonView).orElse(null);
274-
}
275-
// Cast default value
276-
if (schema != null && schema.getDefault() != null) {
277-
PrimitiveType primitiveType = PrimitiveType.fromTypeAndFormat(schema.getType(), schema.getFormat());
278-
if (primitiveType != null) {
279-
Schema<?> primitiveSchema = primitiveType.createProperty();
280-
primitiveSchema.setDefault(schema.getDefault());
281-
schema.setDefault(primitiveSchema.getDefault());
283+
// default value not set by swagger-core for array !
284+
if (schema != null) {
285+
Object defaultValue = SpringDocAnnotationsUtils.resolveDefaultValue(parameterDoc.array().arraySchema().defaultValue());
286+
schema.setDefault(defaultValue);
282287
}
283288
}
284-
285289
parameter.setSchema(schema);
286290
}
287291
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
package org.springdoc.core;
2222

23+
import java.io.IOException;
2324
import java.lang.annotation.Annotation;
2425
import java.lang.reflect.Type;
2526
import java.util.ArrayList;
@@ -34,6 +35,7 @@
3435
import io.swagger.v3.core.converter.ModelConverters;
3536
import io.swagger.v3.core.converter.ResolvedSchema;
3637
import io.swagger.v3.core.util.AnnotationsUtils;
38+
import io.swagger.v3.core.util.Json;
3739
import io.swagger.v3.oas.annotations.Hidden;
3840
import io.swagger.v3.oas.annotations.media.ExampleObject;
3941
import io.swagger.v3.oas.models.Components;
@@ -375,4 +377,16 @@ private static boolean isArray(io.swagger.v3.oas.annotations.media.Content annot
375377
return isArray;
376378
}
377379

380+
public static Object resolveDefaultValue(String defaultValueStr) {
381+
Object defaultValue = null;
382+
if (StringUtils.isNotEmpty(defaultValueStr)) {
383+
try {
384+
defaultValue = Json.mapper().readTree(defaultValueStr);
385+
}
386+
catch (IOException e) {
387+
defaultValue = defaultValueStr;
388+
}
389+
}
390+
return defaultValue;
391+
}
378392
}

springdoc-openapi-data-rest/src/main/java/org/springdoc/data/rest/customisers/DataRestDelegatingMethodParameterCustomizer.java

Lines changed: 265 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@
22

33
import java.lang.annotation.Annotation;
44
import java.lang.reflect.Field;
5+
import java.util.ArrayList;
6+
import java.util.List;
57
import java.util.Optional;
68

9+
import com.fasterxml.jackson.core.JsonProcessingException;
10+
import io.swagger.v3.core.util.ObjectMapperFactory;
711
import io.swagger.v3.oas.annotations.ExternalDocumentation;
812
import io.swagger.v3.oas.annotations.Parameter;
913
import io.swagger.v3.oas.annotations.enums.Explode;
@@ -345,7 +349,240 @@ public Extension[] extensions() {
345349

346350
@Override
347351
public ArraySchema array() {
348-
return parameter.array();
352+
ArraySchema arraySchema = parameter.array();
353+
return new ArraySchema() {
354+
@Override
355+
public Class<? extends Annotation> annotationType() {
356+
return arraySchema.annotationType();
357+
}
358+
359+
@Override
360+
public Schema schema() {
361+
return arraySchema.schema();
362+
}
363+
364+
@Override
365+
public Schema arraySchema() {
366+
Schema schema = arraySchema.arraySchema();
367+
return new Schema() {
368+
369+
@Override
370+
public Class<? extends Annotation> annotationType() {
371+
return schema.annotationType();
372+
}
373+
374+
@Override
375+
public Class<?> implementation() {
376+
return schema.implementation();
377+
}
378+
379+
@Override
380+
public Class<?> not() {
381+
return schema.not();
382+
}
383+
384+
@Override
385+
public Class<?>[] oneOf() {
386+
return schema.oneOf();
387+
}
388+
389+
@Override
390+
public Class<?>[] anyOf() {
391+
return schema.anyOf();
392+
}
393+
394+
@Override
395+
public Class<?>[] allOf() {
396+
return schema.allOf();
397+
}
398+
399+
@Override
400+
public String name() {
401+
return schema.name();
402+
}
403+
404+
@Override
405+
public String title() {
406+
return schema.title();
407+
}
408+
409+
@Override
410+
public double multipleOf() {
411+
return schema.multipleOf();
412+
}
413+
414+
@Override
415+
public String maximum() {
416+
return schema.maximum();
417+
}
418+
419+
@Override
420+
public boolean exclusiveMaximum() {
421+
return schema.exclusiveMaximum();
422+
}
423+
424+
@Override
425+
public String minimum() {
426+
return schema.minimum();
427+
}
428+
429+
@Override
430+
public boolean exclusiveMinimum() {
431+
return schema.exclusiveMinimum();
432+
}
433+
434+
@Override
435+
public int maxLength() {
436+
return schema.maxLength();
437+
}
438+
439+
@Override
440+
public int minLength() {
441+
return schema.minLength();
442+
}
443+
444+
@Override
445+
public String pattern() {
446+
return schema.pattern();
447+
}
448+
449+
@Override
450+
public int maxProperties() {
451+
return schema.maxProperties();
452+
}
453+
454+
@Override
455+
public int minProperties() {
456+
return schema.minProperties();
457+
}
458+
459+
@Override
460+
public String[] requiredProperties() {
461+
return schema.requiredProperties();
462+
}
463+
464+
@Override
465+
public boolean required() {
466+
return schema.required();
467+
}
468+
469+
@Override
470+
public String description() {
471+
return schema.description();
472+
}
473+
474+
@Override
475+
public String format() {
476+
return schema.format();
477+
}
478+
479+
@Override
480+
public String ref() {
481+
return schema.ref();
482+
}
483+
484+
@Override
485+
public boolean nullable() {
486+
return schema.nullable();
487+
}
488+
489+
@Override
490+
public boolean readOnly() {
491+
return AccessMode.READ_ONLY.equals(schema.accessMode());
492+
}
493+
494+
@Override
495+
public boolean writeOnly() {
496+
return AccessMode.WRITE_ONLY.equals(schema.accessMode());
497+
}
498+
499+
@Override
500+
public AccessMode accessMode() {
501+
return schema.accessMode();
502+
}
503+
504+
@Override
505+
public String example() {
506+
return schema.example();
507+
}
508+
509+
@Override
510+
public ExternalDocumentation externalDocs() {
511+
return schema.externalDocs();
512+
}
513+
514+
@Override
515+
public boolean deprecated() {
516+
return schema.deprecated();
517+
}
518+
519+
@Override
520+
public String type() {
521+
return schema.type();
522+
}
523+
524+
@Override
525+
public String[] allowableValues() {
526+
return schema.allowableValues();
527+
}
528+
529+
@Override
530+
public String defaultValue() {
531+
return getArrayDefaultValue(parameterName, pageableDefault, schema.defaultValue());
532+
}
533+
534+
@Override
535+
public String discriminatorProperty() {
536+
return schema.discriminatorProperty();
537+
}
538+
539+
@Override
540+
public DiscriminatorMapping[] discriminatorMapping() {
541+
return schema.discriminatorMapping();
542+
}
543+
544+
@Override
545+
public boolean hidden() {
546+
return schema.hidden();
547+
}
548+
549+
@Override
550+
public boolean enumAsRef() {
551+
return schema.enumAsRef();
552+
}
553+
554+
@Override
555+
public Class<?>[] subTypes() {
556+
return schema.subTypes();
557+
}
558+
559+
@Override
560+
public Extension[] extensions() {
561+
return schema.extensions();
562+
}
563+
};
564+
}
565+
566+
@Override
567+
public int maxItems() {
568+
return arraySchema.maxItems();
569+
}
570+
571+
@Override
572+
public int minItems() {
573+
return arraySchema.minItems();
574+
}
575+
576+
@Override
577+
public boolean uniqueItems() {
578+
return arraySchema.uniqueItems();
579+
}
580+
581+
@Override
582+
public Extension[] extensions() {
583+
return arraySchema.extensions();
584+
}
585+
};
349586
}
350587

351588
@Override
@@ -392,7 +629,7 @@ public String ref() {
392629
* @param originalName the original name
393630
* @return the name
394631
*/
395-
private String getName(String parameterName , String originalName) {
632+
private String getName(String parameterName, String originalName) {
396633
String name = null;
397634
switch (parameterName) {
398635
case "size":
@@ -450,27 +687,43 @@ else if (optionalSpringDataWebProperties.isPresent())
450687
else
451688
defaultValue = defaultSchemaVal;
452689
break;
453-
case "sort":
454-
if (pageableDefault != null)
455-
defaultValue = defaultSchemaVal;
456-
break;
457690
case "page":
458691
if (pageableDefault != null)
459692
defaultValue = String.valueOf(pageableDefault.page());
460693
else
461694
defaultValue = defaultSchemaVal;
462695
break;
463-
case "direction":
464-
if (pageableDefault != null)
465-
defaultValue = pageableDefault.direction().name();
466-
else
467-
defaultValue = defaultSchemaVal;
468-
break;
469696
default:
470697
// Do nothing here
471698
break;
472699
}
473700
return defaultValue;
474701
}
475702

703+
/**
704+
* Gets default value.
705+
*
706+
* @param parameterName the parameter name
707+
* @param pageableDefault the pageable default
708+
* @param defaultSchemaVal the default schema val
709+
* @return the default value
710+
*/
711+
private String getArrayDefaultValue(String parameterName, PageableDefault pageableDefault, String defaultSchemaVal) {
712+
String defaultValue = defaultSchemaVal;
713+
if ("sort".equals(parameterName) && pageableDefault != null && ArrayUtils.isNotEmpty(pageableDefault.sort())) {
714+
List<String> sortValues = new ArrayList<>();
715+
for (String sortValue : pageableDefault.sort()) {
716+
String sortStr = String.join(",", sortValue, pageableDefault.direction().name());
717+
sortValues.add(sortStr);
718+
}
719+
try {
720+
defaultValue = ObjectMapperFactory.buildStrictGenericObjectMapper().writeValueAsString(sortValues);
721+
}
722+
catch (JsonProcessingException e) {
723+
LOGGER.warn(e.getMessage());
724+
}
725+
}
726+
return defaultValue;
727+
}
728+
476729
}

0 commit comments

Comments
 (0)