2424
2525import java .io .IOException ;
2626import java .lang .annotation .Annotation ;
27+ import java .lang .reflect .Field ;
2728import java .lang .reflect .ParameterizedType ;
2829import java .lang .reflect .Type ;
2930import java .lang .reflect .WildcardType ;
3435import java .util .List ;
3536import java .util .Locale ;
3637import java .util .Map ;
38+ import java .util .Objects ;
3739import java .util .Optional ;
3840
3941import com .fasterxml .jackson .annotation .JsonView ;
5355import io .swagger .v3 .oas .models .media .Schema ;
5456import io .swagger .v3 .oas .models .parameters .Parameter ;
5557import org .apache .commons .lang3 .StringUtils ;
58+ import org .apache .commons .lang3 .reflect .FieldUtils ;
5659import org .slf4j .Logger ;
5760import org .slf4j .LoggerFactory ;
5861import org .springdoc .core .customizers .DelegatingMethodParameterCustomizer ;
62+ import org .springdoc .core .providers .JavadocProvider ;
5963import org .springdoc .core .providers .ObjectMapperProvider ;
6064import org .springdoc .core .providers .WebConversionServiceProvider ;
6165
6468import org .springframework .beans .factory .config .ConfigurableBeanFactory ;
6569import org .springframework .core .MethodParameter ;
6670import org .springframework .core .ResolvableType ;
71+ import org .springframework .core .annotation .AnnotatedElementUtils ;
6772import org .springframework .core .io .Resource ;
6873import org .springframework .web .context .request .RequestScope ;
6974import org .springframework .web .multipart .MultipartFile ;
7075import org .springframework .web .multipart .MultipartRequest ;
7176
77+ import static org .springdoc .core .Constants .DOT ;
78+
7279/**
7380 * The type Generic parameter builder.
7481 * @author bnasslahsen, coutin
@@ -123,20 +130,28 @@ public class GenericParameterService {
123130 private final ObjectMapperProvider objectMapperProvider ;
124131
125132 /**
126- * Instantiates a new Generic parameter builder.
133+ * The javadoc provider.
134+ */
135+ private final Optional <JavadocProvider > javadocProviderOptional ;
136+
137+ /**
138+ * Instantiates a new Generic parameter service.
139+ *
127140 * @param propertyResolverUtils the property resolver utils
128141 * @param optionalDelegatingMethodParameterCustomizer the optional delegating method parameter customizer
129142 * @param optionalWebConversionServiceProvider the optional web conversion service provider
130143 * @param objectMapperProvider the object mapper provider
144+ * @param javadocProviderOptional the javadoc provider
131145 */
132146 public GenericParameterService (PropertyResolverUtils propertyResolverUtils , Optional <DelegatingMethodParameterCustomizer > optionalDelegatingMethodParameterCustomizer ,
133- Optional <WebConversionServiceProvider > optionalWebConversionServiceProvider , ObjectMapperProvider objectMapperProvider ) {
147+ Optional <WebConversionServiceProvider > optionalWebConversionServiceProvider , ObjectMapperProvider objectMapperProvider , Optional < JavadocProvider > javadocProviderOptional ) {
134148 this .propertyResolverUtils = propertyResolverUtils ;
135149 this .optionalDelegatingMethodParameterCustomizer = optionalDelegatingMethodParameterCustomizer ;
136150 this .optionalWebConversionServiceProvider = optionalWebConversionServiceProvider ;
137151 this .configurableBeanFactory = propertyResolverUtils .getFactory ();
138152 this .expressionContext = (configurableBeanFactory != null ? new BeanExpressionContext (configurableBeanFactory , new RequestScope ()) : null );
139153 this .objectMapperProvider = objectMapperProvider ;
154+ this .javadocProviderOptional = javadocProviderOptional ;
140155 }
141156
142157 /**
@@ -338,9 +353,9 @@ Schema calculateSchema(Components components, ParameterInfo parameterInfo, Reque
338353
339354 if (parameterInfo .getParameterModel () == null || parameterInfo .getParameterModel ().getSchema () == null ) {
340355 Type type = ReturnTypeParser .getType (methodParameter );
341- if (type instanceof Class && optionalWebConversionServiceProvider .isPresent ()){
356+ if (type instanceof Class && optionalWebConversionServiceProvider .isPresent ()) {
342357 WebConversionServiceProvider webConversionServiceProvider = optionalWebConversionServiceProvider .get ();
343- if (!MethodParameterPojoExtractor .isSwaggerPrimitiveType ((Class ) type ) && methodParameter .getParameterType ().getAnnotation (io .swagger .v3 .oas .annotations .media .Schema .class )== null )
358+ if (!MethodParameterPojoExtractor .isSwaggerPrimitiveType ((Class ) type ) && methodParameter .getParameterType ().getAnnotation (io .swagger .v3 .oas .annotations .media .Schema .class ) == null )
344359 type = webConversionServiceProvider .getSpringConvertedType (methodParameter .getParameterType ());
345360 }
346361 schemaN = SpringDocAnnotationsUtils .extractSchema (components , type , jsonView , methodParameter .getParameterAnnotations ());
@@ -350,6 +365,16 @@ Schema calculateSchema(Components components, ParameterInfo parameterInfo, Reque
350365
351366 if (requestBodyInfo != null ) {
352367 schemaN = calculateRequestBodySchema (components , parameterInfo , requestBodyInfo , schemaN , paramName );
368+ JavadocProvider javadocProvider = javadocProviderOptional .orElse (null );
369+ if (schemaN != null && javadocProvider != null && !isRequestBodyPresent (parameterInfo )) {
370+ String paramJavadocDescription = getParamJavadoc (javadocProvider , methodParameter );
371+ if (schemaN .getProperties () != null && schemaN .getProperties ().containsKey (parameterInfo .getpName ())) {
372+ Map <String , Schema > properties = schemaN .getProperties ();
373+ if (!StringUtils .isBlank (paramJavadocDescription ) && StringUtils .isBlank (properties .get (parameterInfo .getpName ()).getDescription ())) {
374+ properties .get (parameterInfo .getpName ()).setDescription (paramJavadocDescription );
375+ }
376+ }
377+ }
353378 }
354379
355380 return schemaN ;
@@ -571,6 +596,7 @@ public io.swagger.v3.oas.annotations.Parameter generateParameterBySchema(io.swag
571596 public Class <? extends Annotation > annotationType () {
572597 return io .swagger .v3 .oas .annotations .Parameter .class ;
573598 }
599+
574600 @ Override
575601 public String name () {
576602 return schema .name ();
@@ -657,4 +683,48 @@ public String ref() {
657683 }
658684 };
659685 }
686+
687+ /**
688+ * Gets javadoc provider.
689+ *
690+ * @return the javadoc provider
691+ */
692+ public JavadocProvider getJavadocProvider () {
693+ return javadocProviderOptional .orElse (null );
694+ }
695+
696+ /**
697+ * Is request body present boolean.
698+ *
699+ * @param parameterInfo the parameter info
700+ * @return the boolean
701+ */
702+ public boolean isRequestBodyPresent (ParameterInfo parameterInfo ) {
703+ return parameterInfo .getMethodParameter ().getParameterAnnotation (io .swagger .v3 .oas .annotations .parameters .RequestBody .class ) != null
704+ || parameterInfo .getMethodParameter ().getParameterAnnotation (org .springframework .web .bind .annotation .RequestBody .class ) != null
705+ || AnnotatedElementUtils .findMergedAnnotation (Objects .requireNonNull (parameterInfo .getMethodParameter ().getMethod ()), io .swagger .v3 .oas .annotations .parameters .RequestBody .class ) != null ;
706+ }
707+
708+ /**
709+ * Gets param javadoc.
710+ *
711+ * @param javadocProvider the javadoc provider
712+ * @param methodParameter the method parameter
713+ * @return the param javadoc
714+ */
715+ String getParamJavadoc (JavadocProvider javadocProvider , MethodParameter methodParameter ) {
716+ String pName = methodParameter .getParameterName ();
717+ DelegatingMethodParameter delegatingMethodParameter = (DelegatingMethodParameter ) methodParameter ;
718+ final String paramJavadocDescription ;
719+ if (delegatingMethodParameter .isParameterObject ()) {
720+ String fieldName ; if (StringUtils .isNotEmpty (pName ) && pName .contains (DOT ))
721+ fieldName = StringUtils .substringAfterLast (pName , DOT );
722+ else fieldName = pName ;
723+ Field field = FieldUtils .getDeclaredField (((DelegatingMethodParameter ) methodParameter ).getExecutable ().getDeclaringClass (), fieldName , true );
724+ paramJavadocDescription = javadocProvider .getFieldJavadoc (field );
725+ }
726+ else
727+ paramJavadocDescription = javadocProvider .getParamJavadoc (methodParameter .getMethod (), pName );
728+ return paramJavadocDescription ;
729+ }
660730}
0 commit comments