@@ -9,6 +9,7 @@ import io.swagger.v3.core.converter._
99import io .swagger .v3 .core .jackson .ModelResolver
1010import io .swagger .v3 .core .util .{Json , PrimitiveType }
1111import io .swagger .v3 .oas .annotations .Parameter
12+ import io .swagger .v3 .oas .annotations .media .Schema .RequiredMode
1213import io .swagger .v3 .oas .annotations .media .{ArraySchema , Schema => SchemaAnnotation }
1314import io .swagger .v3 .oas .models .media .{MapSchema , ObjectSchema , Schema }
1415import org .slf4j .LoggerFactory
@@ -130,10 +131,7 @@ class SwaggerScalaModelConverter extends ModelResolver(SwaggerScalaModelConverte
130131 val annotatedOverrides = getRequiredSettings(`type`)
131132 if (_isOptional(`type`, cls)) {
132133 val baseType =
133- if (
134- SwaggerScalaModelConverter .isRequiredBasedOnAnnotation
135- && annotatedOverrides.headOption.getOrElse(false )
136- ) new AnnotatedType ()
134+ if (annotatedOverrides.headOption.getOrElse(false )) new AnnotatedType ()
137135 else new AnnotatedTypeForOption ()
138136 resolve(nextType(baseType, `type`, javaType), context, chain)
139137 } else if (! annotatedOverrides.headOption.getOrElse(true )) {
@@ -236,12 +234,8 @@ class SwaggerScalaModelConverter extends ModelResolver(SwaggerScalaModelConverte
236234 }
237235 }
238236 case annotations => {
239- val annotationRequired = getRequiredSettings(annotations).headOption.getOrElse(false )
240- if (SwaggerScalaModelConverter .isRequiredBasedOnAnnotation) {
241- setRequiredBasedOnAnnotation(schema, propertyName, annotationRequired)
242- } else {
243- setRequiredBasedOnType(schema, propertyName, isOptional, hasDefaultValue, annotationRequired)
244- }
237+ val annotationRequired = getRequiredSettings(annotations).headOption
238+ setRequiredBasedOnType(schema, propertyName, isOptional, hasDefaultValue, annotationRequired)
245239 }
246240 }
247241
@@ -272,26 +266,25 @@ class SwaggerScalaModelConverter extends ModelResolver(SwaggerScalaModelConverte
272266 }
273267 }
274268
275- private def setRequiredBasedOnAnnotation (
276- schema : Schema [_],
277- propertyName : String ,
278- annotationSetting : Boolean
279- ): Unit = {
280- if (annotationSetting) addRequiredItem(schema, propertyName)
281- }
282-
283269 private def setRequiredBasedOnType (
284270 schema : Schema [_],
285271 propertyName : String ,
286272 isOptional : Boolean ,
287273 hasDefaultValue : Boolean ,
288- annotationSetting : Boolean
274+ annotationSetting : Option [ Boolean ]
289275 ): Unit = {
290- val required = if (isOptional) {
291- annotationSetting
292- } else if (SwaggerScalaModelConverter .isRequiredBasedOnDefaultValue) {
293- ! hasDefaultValue
294- } else true
276+ val required = annotationSetting match {
277+ case Some (req) => req
278+ case _ => {
279+ if (isOptional) {
280+ false
281+ } else if (SwaggerScalaModelConverter .isRequiredBasedOnDefaultValue) {
282+ ! hasDefaultValue
283+ } else {
284+ true
285+ }
286+ }
287+ }
295288 if (required) addRequiredItem(schema, propertyName)
296289 }
297290
@@ -326,10 +319,39 @@ class SwaggerScalaModelConverter extends ModelResolver(SwaggerScalaModelConverte
326319 }
327320
328321 private def getRequiredSettings (annotations : Seq [Annotation ]): Seq [Boolean ] = {
329- annotations.collect {
330- case p : Parameter => p.required()
331- case s : SchemaAnnotation => s.required()
332- case a : ArraySchema => a.arraySchema().required()
322+ val flags = annotations.collect {
323+ case p : Parameter => if (p.required()) RequiredMode .REQUIRED else RequiredMode .NOT_REQUIRED
324+ case s : SchemaAnnotation => {
325+ if (s.requiredMode() == RequiredMode .AUTO ) {
326+ if (s.required()) {
327+ RequiredMode .REQUIRED
328+ } else if (SwaggerScalaModelConverter .isRequiredBasedOnAnnotation) {
329+ RequiredMode .NOT_REQUIRED
330+ } else {
331+ RequiredMode .AUTO
332+ }
333+ } else {
334+ s.requiredMode()
335+ }
336+ }
337+ case a : ArraySchema => {
338+ if (a.arraySchema().requiredMode() == RequiredMode .AUTO ) {
339+ if (a.arraySchema().required()) {
340+ RequiredMode .REQUIRED
341+ } else if (SwaggerScalaModelConverter .isRequiredBasedOnAnnotation) {
342+ RequiredMode .NOT_REQUIRED
343+ } else {
344+ RequiredMode .AUTO
345+ }
346+ } else {
347+ a.arraySchema().requiredMode()
348+ }
349+ }
350+ }
351+ flags.flatMap {
352+ case RequiredMode .REQUIRED => Some (true )
353+ case RequiredMode .NOT_REQUIRED => Some (false )
354+ case _ => None
333355 }
334356 }
335357
0 commit comments