4141import java .util .Map ;
4242import java .util .Objects ;
4343import java .util .Optional ;
44+ import java .util .stream .Stream ;
4445
4546import com .fasterxml .jackson .annotation .JsonView ;
4647import io .swagger .v3 .core .util .AnnotationsUtils ;
4950import io .swagger .v3 .oas .annotations .enums .ParameterIn ;
5051import io .swagger .v3 .oas .annotations .enums .ParameterStyle ;
5152import io .swagger .v3 .oas .annotations .extensions .Extension ;
53+ import io .swagger .v3 .oas .annotations .media .ArraySchema ;
5254import io .swagger .v3 .oas .annotations .media .ExampleObject ;
5355import io .swagger .v3 .oas .annotations .media .Schema .RequiredMode ;
56+ import io .swagger .v3 .oas .annotations .parameters .RequestBody ;
5457import io .swagger .v3 .oas .models .Components ;
5558import io .swagger .v3 .oas .models .examples .Example ;
5659import io .swagger .v3 .oas .models .media .Content ;
5760import io .swagger .v3 .oas .models .media .FileSchema ;
5861import io .swagger .v3 .oas .models .media .ObjectSchema ;
5962import io .swagger .v3 .oas .models .media .Schema ;
6063import io .swagger .v3 .oas .models .parameters .Parameter ;
64+ import io .swagger .v3 .oas .models .parameters .Parameter .StyleEnum ;
6165import org .apache .commons .lang3 .StringUtils ;
6266import org .apache .commons .lang3 .reflect .FieldUtils ;
6367import org .slf4j .Logger ;
6468import org .slf4j .LoggerFactory ;
69+ import org .springdoc .core .converters .KotlinInlineParameterResolver ;
6570import org .springdoc .core .extractor .DelegatingMethodParameter ;
6671import org .springdoc .core .extractor .MethodParameterPojoExtractor ;
6772import org .springdoc .core .models .ParameterInfo ;
7883import org .springframework .beans .factory .config .BeanExpressionResolver ;
7984import org .springframework .beans .factory .config .ConfigurableBeanFactory ;
8085import org .springframework .core .GenericTypeResolver ;
86+ import org .springframework .core .KotlinDetector ;
8187import org .springframework .core .MethodParameter ;
8288import org .springframework .core .ResolvableType ;
8389import org .springframework .core .annotation .AnnotatedElementUtils ;
@@ -152,7 +158,7 @@ public class GenericParameterService {
152158 * @param objectMapperProvider the object mapper provider
153159 * @param javadocProviderOptional the javadoc provider
154160 */
155- public GenericParameterService (PropertyResolverUtils propertyResolverUtils ,
161+ public GenericParameterService (PropertyResolverUtils propertyResolverUtils ,
156162 Optional <WebConversionServiceProvider > optionalWebConversionServiceProvider , ObjectMapperProvider objectMapperProvider , Optional <JavadocProvider > javadocProviderOptional ) {
157163 this .propertyResolverUtils = propertyResolverUtils ;
158164 this .optionalWebConversionServiceProvider = optionalWebConversionServiceProvider ;
@@ -367,15 +373,34 @@ Schema calculateSchema(Components components, ParameterInfo parameterInfo, Reque
367373
368374 if (parameterInfo .getParameterModel () == null || parameterInfo .getParameterModel ().getSchema () == null ) {
369375 Type type = GenericTypeResolver .resolveType (methodParameter .getGenericParameterType (), methodParameter .getContainingClass ());
376+ Annotation [] paramAnnotations = getParameterAnnotations (methodParameter );
377+ Annotation [] typeAnnotations = new Annotation [0 ];
378+ if (KotlinDetector .isKotlinPresent ()
379+ && KotlinDetector .isKotlinReflectPresent ()
380+ && KotlinDetector .isKotlinType (methodParameter .getContainingClass ())
381+ && type == String .class ) {
382+ Class <?> restored = KotlinInlineParameterResolver
383+ .resolveInlineType (methodParameter , type );
384+ if (restored != null ) {
385+ type = restored ;
386+ typeAnnotations = ((Class <?>) type ).getAnnotations ();
387+ }
388+ }
389+ Annotation [] mergedAnnotations =
390+ Stream .concat (
391+ Arrays .stream (paramAnnotations ),
392+ Arrays .stream (typeAnnotations )
393+ ).toArray (Annotation []::new );
370394 if (type instanceof Class && !((Class <?>) type ).isEnum () && optionalWebConversionServiceProvider .isPresent ()) {
371395 WebConversionServiceProvider webConversionServiceProvider = optionalWebConversionServiceProvider .get ();
372- if (!MethodParameterPojoExtractor .isSwaggerPrimitiveType ((Class ) type ) && methodParameter .getParameterType ().getAnnotation (io .swagger .v3 .oas .annotations .media .Schema .class ) == null ) {
396+ if (!MethodParameterPojoExtractor .isSwaggerPrimitiveType ((Class ) type ) && Arrays .stream (mergedAnnotations )
397+ .noneMatch (a -> a .annotationType () == io .swagger .v3 .oas .annotations .media .Schema .class )) {
373398 Class <?> springConvertedType = webConversionServiceProvider .getSpringConvertedType (methodParameter .getParameterType ());
374399 if (!(String .class .equals (springConvertedType ) && ((Class <?>) type ).isEnum ()) && requestBodyInfo == null )
375400 type = springConvertedType ;
376401 }
377402 }
378- schemaN = SpringDocAnnotationsUtils .extractSchema (components , type , jsonView , getParameterAnnotations ( methodParameter ) , propertyResolverUtils .getSpecVersion ());
403+ schemaN = SpringDocAnnotationsUtils .extractSchema (components , type , jsonView , mergedAnnotations , propertyResolverUtils .getSpecVersion ());
379404 }
380405 else
381406 schemaN = parameterInfo .getParameterModel ().getSchema ();
@@ -505,7 +530,7 @@ else if (Explode.FALSE.equals(p.explode())) {
505530 */
506531 private void setParameterStyle (Parameter parameter , io .swagger .v3 .oas .annotations .Parameter p ) {
507532 if (StringUtils .isNotBlank (p .style ().toString ())) {
508- parameter .setStyle (Parameter . StyleEnum .valueOf (p .style ().toString ().toUpperCase ()));
533+ parameter .setStyle (StyleEnum .valueOf (p .style ().toString ().toUpperCase ()));
509534 }
510535 }
511536
@@ -517,7 +542,7 @@ private void setParameterStyle(Parameter parameter, io.swagger.v3.oas.annotation
517542 */
518543 private boolean isExplodable (io .swagger .v3 .oas .annotations .Parameter p ) {
519544 io .swagger .v3 .oas .annotations .media .Schema schema = p .schema ();
520- io . swagger . v3 . oas . annotations . media . ArraySchema arraySchema = p .array ();
545+ ArraySchema arraySchema = p .array ();
521546
522547 boolean explode = true ;
523548 Class <?> implementation = schema .implementation ();
@@ -665,7 +690,7 @@ public io.swagger.v3.oas.annotations.media.Schema schema() {
665690 }
666691
667692 @ Override
668- public io . swagger . v3 . oas . annotations . media . ArraySchema array () {
693+ public ArraySchema array () {
669694 return null ;
670695 }
671696
@@ -722,9 +747,9 @@ public JavadocProvider getJavadocProvider() {
722747 * @return the boolean
723748 */
724749 public boolean isRequestBodyPresent (ParameterInfo parameterInfo ) {
725- return parameterInfo .getMethodParameter ().getParameterAnnotation (io . swagger . v3 . oas . annotations . parameters . RequestBody .class ) != null
750+ return parameterInfo .getMethodParameter ().getParameterAnnotation (RequestBody .class ) != null
726751 || parameterInfo .getMethodParameter ().getParameterAnnotation (org .springframework .web .bind .annotation .RequestBody .class ) != null
727- || AnnotatedElementUtils .findMergedAnnotation (Objects .requireNonNull (parameterInfo .getMethodParameter ().getMethod ()), io . swagger . v3 . oas . annotations . parameters . RequestBody .class ) != null ;
752+ || AnnotatedElementUtils .findMergedAnnotation (Objects .requireNonNull (parameterInfo .getMethodParameter ().getMethod ()), RequestBody .class ) != null ;
728753 }
729754
730755 /**
0 commit comments