4646import java .time .ZoneOffset ;
4747import java .util .ArrayList ;
4848import java .util .Arrays ;
49- import java .util .Collection ;
5049import java .util .HashSet ;
51- import java .util .LinkedHashSet ;
5250import java .util .List ;
5351import java .util .Map ;
5452import java .util .Objects ;
6159import java .util .concurrent .atomic .AtomicInteger ;
6260import java .util .concurrent .atomic .AtomicLong ;
6361import java .util .function .Predicate ;
64- import java .util .stream .Collectors ;
6562import java .util .stream .Stream ;
6663
6764import io .swagger .v3 .core .util .PrimitiveType ;
6865import io .swagger .v3 .oas .annotations .Parameter ;
6966import io .swagger .v3 .oas .annotations .media .Schema ;
7067
68+ import org .springdoc .core .utils .SchemaUtils ;
7169import org .springframework .core .GenericTypeResolver ;
7270import org .springframework .core .MethodParameter ;
7371
74- import static org .springdoc .core .service .AbstractRequestService .hasNotNullAnnotation ;
7572import static org .springdoc .core .utils .Constants .DOT ;
7673
7774/**
@@ -174,13 +171,13 @@ private static Stream<MethodParameter> fromGetterOfField(Class<?> paramClass, Fi
174171 else {
175172 Parameter parameter = field .getAnnotation (Parameter .class );
176173 Schema schema = field .getAnnotation (Schema .class );
177- boolean visible = resolveVisible ( parameter , schema );
174+ boolean visible = SchemaUtils . swaggerVisible ( schema , parameter );
178175 if (!visible ) {
179176 return Stream .empty ();
180177 }
181178 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 );
184181 }
185182 }
186183
@@ -208,46 +205,6 @@ private static Optional<String> resolveNameFromSchema(Schema schema) {
208205 return Optional .of (schema .name ());
209206 }
210207
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-
251208 /**
252209 * Extract the type
253210 *
@@ -277,20 +234,21 @@ private static Class<?> extractType(Class<?> paramClass, Field field) {
277234 * @param fieldNamePrefix the field name prefix
278235 * @return the stream
279236 */
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 ) {
281238 Annotation [] fieldAnnotations = field .getDeclaredAnnotations ();
282239 try {
283240 Parameter parameter = field .getAnnotation (Parameter .class );
284241 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 ;
287245 if (paramClass .getSuperclass () != null && paramClass .isRecord ()) {
288246 return Stream .of (paramClass .getRecordComponents ())
289247 .filter (d -> d .getName ().equals (field .getName ()))
290248 .map (RecordComponent ::getAccessor )
291249 .map (method -> new MethodParameter (method , -1 ))
292250 .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 ));
294252 }
295253 else
296254 return Stream .of (Introspector .getBeanInfo (paramClass ).getPropertyDescriptors ())
@@ -299,15 +257,15 @@ private static Stream<MethodParameter> fromSimpleClass(Class<?> paramClass, Fiel
299257 .filter (Objects ::nonNull )
300258 .map (method -> new MethodParameter (method , -1 ))
301259 .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 ));
303261 }
304262 catch (IntrospectionException e ) {
305263 return Stream .of ();
306264 }
307265 }
308266
309267 /**
310- * All fields of list.
268+ * All fields of list. include parent fields
311269 *
312270 * @param clazz the clazz
313271 * @return the list
@@ -370,17 +328,5 @@ public static void removeSimpleTypes(Class<?>... classes) {
370328 SIMPLE_TYPES .removeAll (Arrays .asList (classes ));
371329 }
372330
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+
386332}
0 commit comments