46
46
import java .time .ZoneOffset ;
47
47
import java .util .ArrayList ;
48
48
import java .util .Arrays ;
49
- import java .util .Collection ;
50
49
import java .util .HashSet ;
51
- import java .util .LinkedHashSet ;
52
50
import java .util .List ;
53
51
import java .util .Map ;
54
52
import java .util .Objects ;
61
59
import java .util .concurrent .atomic .AtomicInteger ;
62
60
import java .util .concurrent .atomic .AtomicLong ;
63
61
import java .util .function .Predicate ;
64
- import java .util .stream .Collectors ;
65
62
import java .util .stream .Stream ;
66
63
67
64
import io .swagger .v3 .core .util .PrimitiveType ;
68
65
import io .swagger .v3 .oas .annotations .Parameter ;
69
66
import io .swagger .v3 .oas .annotations .media .Schema ;
70
67
68
+ import org .springdoc .core .utils .SchemaUtils ;
71
69
import org .springframework .core .GenericTypeResolver ;
72
70
import org .springframework .core .MethodParameter ;
73
71
74
- import static org .springdoc .core .service .AbstractRequestService .hasNotNullAnnotation ;
75
72
import static org .springdoc .core .utils .Constants .DOT ;
76
73
77
74
/**
@@ -174,13 +171,13 @@ private static Stream<MethodParameter> fromGetterOfField(Class<?> paramClass, Fi
174
171
else {
175
172
Parameter parameter = field .getAnnotation (Parameter .class );
176
173
Schema schema = field .getAnnotation (Schema .class );
177
- boolean visible = resolveVisible ( parameter , schema );
174
+ boolean visible = SchemaUtils . swaggerVisible ( schema , parameter );
178
175
if (!visible ) {
179
176
return Stream .empty ();
180
177
}
181
178
String prefix = fieldNamePrefix + resolveName (parameter , schema ).orElse (field .getName ()) + DOT ;
182
- boolean isNullable = isNullable ( field . getDeclaredAnnotations () );
183
- return extractFrom (type , prefix , parentRequired && resolveRequired ( schema , parameter , isNullable ) );
179
+ boolean fieldRequired = SchemaUtils . fieldRequired ( field , schema , parameter );
180
+ return extractFrom (type , prefix , parentRequired && fieldRequired );
184
181
}
185
182
}
186
183
@@ -208,46 +205,6 @@ private static Optional<String> resolveNameFromSchema(Schema schema) {
208
205
return Optional .of (schema .name ());
209
206
}
210
207
211
- private static boolean resolveVisible (Parameter parameter , Schema schema ) {
212
- if (parameter != null ) {
213
- return !parameter .hidden ();
214
- }
215
- if (schema != null ) {
216
- return !schema .hidden ();
217
- }
218
- return true ;
219
- }
220
-
221
- private static boolean resolveRequired (Schema schema , Parameter parameter , boolean nullable ) {
222
- if (parameter != null ) {
223
- return resolveRequiredFromParameter (parameter , nullable );
224
- }
225
- if (schema != null ) {
226
- return resolveRequiredFromSchema (schema , nullable );
227
- }
228
- return !nullable ;
229
- }
230
-
231
- private static boolean resolveRequiredFromParameter (Parameter parameter , boolean nullable ) {
232
- if (parameter .required ()) {
233
- return true ;
234
- }
235
- return !nullable ;
236
- }
237
-
238
- private static boolean resolveRequiredFromSchema (Schema schema , boolean nullable ) {
239
- if (schema .required ()) {
240
- return true ;
241
- }
242
- else if (schema .requiredMode () == Schema .RequiredMode .REQUIRED ) {
243
- return true ;
244
- }
245
- else if (schema .requiredMode () == Schema .RequiredMode .NOT_REQUIRED ) {
246
- return false ;
247
- }
248
- return !nullable ;
249
- }
250
-
251
208
/**
252
209
* Extract the type
253
210
*
@@ -277,20 +234,21 @@ private static Class<?> extractType(Class<?> paramClass, Field field) {
277
234
* @param fieldNamePrefix the field name prefix
278
235
* @return the stream
279
236
*/
280
- private static Stream <MethodParameter > fromSimpleClass (Class <?> paramClass , Field field , String fieldNamePrefix , boolean isParentRequired ) {
237
+ private static Stream <MethodParameter > fromSimpleClass (Class <?> paramClass , Field field , String fieldNamePrefix , boolean parentRequired ) {
281
238
Annotation [] fieldAnnotations = field .getDeclaredAnnotations ();
282
239
try {
283
240
Parameter parameter = field .getAnnotation (Parameter .class );
284
241
Schema schema = field .getAnnotation (Schema .class );
285
- boolean isNullable = isNullable (fieldAnnotations );
286
- boolean isNotRequired = !(isParentRequired && resolveRequired (schema , parameter , isNullable ));
242
+ boolean fieldRequired = SchemaUtils .fieldRequired (field , schema , parameter );
243
+
244
+ boolean paramRequired = parentRequired && fieldRequired ;
287
245
if (paramClass .getSuperclass () != null && paramClass .isRecord ()) {
288
246
return Stream .of (paramClass .getRecordComponents ())
289
247
.filter (d -> d .getName ().equals (field .getName ()))
290
248
.map (RecordComponent ::getAccessor )
291
249
.map (method -> new MethodParameter (method , -1 ))
292
250
.map (methodParameter -> DelegatingMethodParameter .changeContainingClass (methodParameter , paramClass ))
293
- .map (param -> new DelegatingMethodParameter (param , fieldNamePrefix + field .getName (), fieldAnnotations , param .getMethodAnnotations (), true , isNotRequired ));
251
+ .map (param -> new DelegatingMethodParameter (param , fieldNamePrefix + field .getName (), fieldAnnotations , param .getMethodAnnotations (), true , field , ! paramRequired ));
294
252
}
295
253
else
296
254
return Stream .of (Introspector .getBeanInfo (paramClass ).getPropertyDescriptors ())
@@ -299,15 +257,15 @@ private static Stream<MethodParameter> fromSimpleClass(Class<?> paramClass, Fiel
299
257
.filter (Objects ::nonNull )
300
258
.map (method -> new MethodParameter (method , -1 ))
301
259
.map (methodParameter -> DelegatingMethodParameter .changeContainingClass (methodParameter , paramClass ))
302
- .map (param -> new DelegatingMethodParameter (param , fieldNamePrefix + field .getName (), fieldAnnotations , param .getMethodAnnotations (), true , isNotRequired ));
260
+ .map (param -> new DelegatingMethodParameter (param , fieldNamePrefix + field .getName (), fieldAnnotations , param .getMethodAnnotations (), true , field , ! paramRequired ));
303
261
}
304
262
catch (IntrospectionException e ) {
305
263
return Stream .of ();
306
264
}
307
265
}
308
266
309
267
/**
310
- * All fields of list.
268
+ * All fields of list. include parent fields
311
269
*
312
270
* @param clazz the clazz
313
271
* @return the list
@@ -370,17 +328,5 @@ public static void removeSimpleTypes(Class<?>... classes) {
370
328
SIMPLE_TYPES .removeAll (Arrays .asList (classes ));
371
329
}
372
330
373
- /**
374
- * Is nullable boolean.
375
- *
376
- * @param fieldAnnotations the field annotations
377
- * @return the boolean
378
- */
379
- private static boolean isNullable (Annotation [] fieldAnnotations ) {
380
- Collection <String > annotationSimpleNames = Arrays .stream (fieldAnnotations )
381
- .map (Annotation ::annotationType )
382
- .map (Class ::getSimpleName )
383
- .collect (Collectors .toCollection (LinkedHashSet ::new ));
384
- return !hasNotNullAnnotation (annotationSimpleNames );
385
- }
331
+
386
332
}
0 commit comments