24
24
25
25
import java .io .IOException ;
26
26
import java .lang .annotation .Annotation ;
27
+ import java .lang .reflect .Field ;
27
28
import java .lang .reflect .ParameterizedType ;
28
29
import java .lang .reflect .Type ;
29
30
import java .lang .reflect .WildcardType ;
34
35
import java .util .List ;
35
36
import java .util .Locale ;
36
37
import java .util .Map ;
38
+ import java .util .Objects ;
37
39
import java .util .Optional ;
38
40
39
41
import com .fasterxml .jackson .annotation .JsonView ;
53
55
import io .swagger .v3 .oas .models .media .Schema ;
54
56
import io .swagger .v3 .oas .models .parameters .Parameter ;
55
57
import org .apache .commons .lang3 .StringUtils ;
58
+ import org .apache .commons .lang3 .reflect .FieldUtils ;
56
59
import org .slf4j .Logger ;
57
60
import org .slf4j .LoggerFactory ;
58
61
import org .springdoc .core .customizers .DelegatingMethodParameterCustomizer ;
62
+ import org .springdoc .core .providers .JavadocProvider ;
59
63
import org .springdoc .core .providers .ObjectMapperProvider ;
60
64
import org .springdoc .core .providers .WebConversionServiceProvider ;
61
65
64
68
import org .springframework .beans .factory .config .ConfigurableBeanFactory ;
65
69
import org .springframework .core .MethodParameter ;
66
70
import org .springframework .core .ResolvableType ;
71
+ import org .springframework .core .annotation .AnnotatedElementUtils ;
67
72
import org .springframework .core .io .Resource ;
68
73
import org .springframework .web .context .request .RequestScope ;
69
74
import org .springframework .web .multipart .MultipartFile ;
70
75
import org .springframework .web .multipart .MultipartRequest ;
71
76
77
+ import static org .springdoc .core .Constants .DOT ;
78
+
72
79
/**
73
80
* The type Generic parameter builder.
74
81
* @author bnasslahsen, coutin
@@ -123,20 +130,28 @@ public class GenericParameterService {
123
130
private final ObjectMapperProvider objectMapperProvider ;
124
131
125
132
/**
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
+ *
127
140
* @param propertyResolverUtils the property resolver utils
128
141
* @param optionalDelegatingMethodParameterCustomizer the optional delegating method parameter customizer
129
142
* @param optionalWebConversionServiceProvider the optional web conversion service provider
130
143
* @param objectMapperProvider the object mapper provider
144
+ * @param javadocProviderOptional the javadoc provider
131
145
*/
132
146
public GenericParameterService (PropertyResolverUtils propertyResolverUtils , Optional <DelegatingMethodParameterCustomizer > optionalDelegatingMethodParameterCustomizer ,
133
- Optional <WebConversionServiceProvider > optionalWebConversionServiceProvider , ObjectMapperProvider objectMapperProvider ) {
147
+ Optional <WebConversionServiceProvider > optionalWebConversionServiceProvider , ObjectMapperProvider objectMapperProvider , Optional < JavadocProvider > javadocProviderOptional ) {
134
148
this .propertyResolverUtils = propertyResolverUtils ;
135
149
this .optionalDelegatingMethodParameterCustomizer = optionalDelegatingMethodParameterCustomizer ;
136
150
this .optionalWebConversionServiceProvider = optionalWebConversionServiceProvider ;
137
151
this .configurableBeanFactory = propertyResolverUtils .getFactory ();
138
152
this .expressionContext = (configurableBeanFactory != null ? new BeanExpressionContext (configurableBeanFactory , new RequestScope ()) : null );
139
153
this .objectMapperProvider = objectMapperProvider ;
154
+ this .javadocProviderOptional = javadocProviderOptional ;
140
155
}
141
156
142
157
/**
@@ -338,9 +353,9 @@ Schema calculateSchema(Components components, ParameterInfo parameterInfo, Reque
338
353
339
354
if (parameterInfo .getParameterModel () == null || parameterInfo .getParameterModel ().getSchema () == null ) {
340
355
Type type = ReturnTypeParser .getType (methodParameter );
341
- if (type instanceof Class && optionalWebConversionServiceProvider .isPresent ()){
356
+ if (type instanceof Class && optionalWebConversionServiceProvider .isPresent ()) {
342
357
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 )
344
359
type = webConversionServiceProvider .getSpringConvertedType (methodParameter .getParameterType ());
345
360
}
346
361
schemaN = SpringDocAnnotationsUtils .extractSchema (components , type , jsonView , methodParameter .getParameterAnnotations ());
@@ -350,6 +365,16 @@ Schema calculateSchema(Components components, ParameterInfo parameterInfo, Reque
350
365
351
366
if (requestBodyInfo != null ) {
352
367
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
+ }
353
378
}
354
379
355
380
return schemaN ;
@@ -571,6 +596,7 @@ public io.swagger.v3.oas.annotations.Parameter generateParameterBySchema(io.swag
571
596
public Class <? extends Annotation > annotationType () {
572
597
return io .swagger .v3 .oas .annotations .Parameter .class ;
573
598
}
599
+
574
600
@ Override
575
601
public String name () {
576
602
return schema .name ();
@@ -657,4 +683,48 @@ public String ref() {
657
683
}
658
684
};
659
685
}
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
+ }
660
730
}
0 commit comments