Skip to content

Commit 39ef9f4

Browse files
committed
Automatically add required if a field is @NotNull or @notblank. Fixes #2817
1 parent 1461070 commit 39ef9f4

File tree

3 files changed

+27
-14
lines changed

3 files changed

+27
-14
lines changed

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/extractor/MethodParameterPojoExtractor.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -159,11 +159,12 @@ private static Stream<MethodParameter> fromGetterOfField(Class<?> paramClass, Fi
159159
return Stream.empty();
160160
}
161161
String prefix = fieldNamePrefix + resolveName(parameter, schema).orElse(field.getName()) + DOT;
162-
boolean notNullAnnotationsPresent = AbstractRequestService.hasNotNullAnnotation(Arrays.stream(field.getDeclaredAnnotations())
162+
Set<String> annotationSimpleNames = Arrays.stream(field.getDeclaredAnnotations())
163163
.map(Annotation::annotationType)
164164
.map(Class::getSimpleName)
165-
.collect(Collectors.toSet()));
166-
return extractFrom(type, prefix, parentRequired && resolveRequired(schema, parameter, !notNullAnnotationsPresent));
165+
.collect(Collectors.toSet());
166+
boolean notNullAnnotationsPresent = AbstractRequestService.hasNotNullAnnotation(annotationSimpleNames);
167+
return extractFrom(type, prefix, resolveRequired(schema, parameter, !notNullAnnotationsPresent));
167168
}
168169
}
169170

@@ -270,10 +271,12 @@ private static Stream<MethodParameter> fromSimpleClass(Class<?> paramClass, Fiel
270271
return Stream.empty();
271272
}
272273

273-
boolean isNotRequired = !(isParentRequired && resolveRequired(schema, parameter, !AbstractRequestService.hasNotNullAnnotation(Arrays.stream(fieldAnnotations)
274+
Set<String> annotationSimpleNames = Arrays.stream(field.getDeclaredAnnotations())
274275
.map(Annotation::annotationType)
275276
.map(Class::getSimpleName)
276-
.collect(Collectors.toSet()))));
277+
.collect(Collectors.toSet());
278+
279+
boolean isNotRequired = !resolveRequired(schema, parameter, !AbstractRequestService.hasNotNullAnnotation(annotationSimpleNames));
277280
Annotation[] notNullFieldAnnotations = Arrays.stream(fieldAnnotations)
278281
.filter(annotation -> AbstractRequestService.hasNotNullAnnotation(List.of(annotation.annotationType().getSimpleName())))
279282
.toArray(Annotation[]::new);

springdoc-openapi-starter-webmvc-api/src/test/java/test/org/springdoc/api/v30/app233/ParameterController.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
import io.swagger.v3.oas.annotations.Parameter;
2929
import io.swagger.v3.oas.annotations.media.Schema;
30+
import jakarta.validation.constraints.NotBlank;
3031
import jakarta.validation.constraints.NotNull;
3132
import org.springdoc.core.annotations.ParameterObject;
3233

@@ -72,15 +73,24 @@ public void nestedParameterObjectWithOptionalParentField(@ParameterObject Parame
7273
}
7374

7475
public record ParameterObjectWithOptionalField(
75-
@Schema(requiredMode = Schema.RequiredMode.NOT_REQUIRED) NestedRequiredParameterObject schemaNotRequiredNestedParameterObject,
76-
@Parameter NestedRequiredParameterObject parameterNotRequiredNestedParameterObject,
77-
@Parameter(required = true) NestedRequiredParameterObject requiredNestedParameterObject
76+
NestedRequiredParameterObject schemaNotRequiredNestedParameterObject,
77+
NestedNonNullParameterObject nestedNonNullParameterObject,
78+
NestedNotBlankParameterObject nestedNotBlankParameterObject
7879
) {
7980

8081
}
8182

8283
public record NestedRequiredParameterObject(
83-
@Schema(requiredMode = Schema.RequiredMode.REQUIRED) @NotNull String requiredParameterField) {
84+
@Schema(requiredMode = Schema.RequiredMode.REQUIRED) String requiredParameterField) {
8485
}
8586

87+
public record NestedNonNullParameterObject(
88+
@NotNull String requiredParameterField) {
89+
}
90+
91+
public record NestedNotBlankParameterObject(
92+
@NotBlank String requiredParameterField) {
93+
}
94+
95+
8696
}

springdoc-openapi-starter-webmvc-api/src/test/resources/results/3.0.1/app233.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,21 +60,21 @@
6060
{
6161
"name": "schemaNotRequiredNestedParameterObject.requiredParameterField",
6262
"in": "query",
63-
"required": false,
63+
"required": true,
6464
"schema": {
6565
"type": "string"
6666
}
6767
},
6868
{
69-
"name": "parameterNotRequiredNestedParameterObject.requiredParameterField",
69+
"name": "nestedNonNullParameterObject.requiredParameterField",
7070
"in": "query",
71-
"required": false,
71+
"required": true,
7272
"schema": {
7373
"type": "string"
7474
}
7575
},
7676
{
77-
"name": "requiredNestedParameterObject.requiredParameterField",
77+
"name": "nestedNotBlankParameterObject.requiredParameterField",
7878
"in": "query",
7979
"required": true,
8080
"schema": {
@@ -114,4 +114,4 @@
114114
}
115115
},
116116
"components": {}
117-
}
117+
}

0 commit comments

Comments
 (0)