Skip to content

Support returning null in ParameterCustomizer #2822

Closed
@martin-tarjanyi

Description

@martin-tarjanyi

Is your feature request related to a problem? Please describe.

My use case is that I'd like to hide certain operation parameters based on an annotation and an environment specific condition. I've successfully done this with OperationCustomizer and PropertyCustomizer without any issues but unfortunately in case of ParameterCustomizer this results in a NullPointerException.

Describe the solution you'd like
ParameterCustomizer to support returning null values and omit the parameter from the OpenAPI JSON if customizer returns null

Describe alternatives you've considered
I considered setting some property with a specific value in Parameter and later filter it out in the OperationCustomizer. This works but a bit ugly.

Additional context
Here is my customizer...

  @Bean
  fun parameterEnvironmentCustomizer(): ParameterCustomizer =
    ParameterCustomizer { model, methodParameter ->
      if (methodParameter.parameterAnnotations.any { it.annotationClass == InDevelopmentProperty::class } &&
        !properties.publishInDevelopmentProperties
      ) {
        null
      } else {
        model
      }
    }

...causing this exception:

Caused by: java.lang.NullPointerException: Cannot invoke "io.swagger.v3.oas.models.parameters.Parameter.getName()" because "parameter" is null
	at org.springdoc.core.models.ParameterId.<init>(ParameterId.java:57)
	at java.base/java.util.stream.Collectors.lambda$toMap$68(Collectors.java:1673)
	at java.base/java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
	at org.springdoc.core.service.AbstractRequestService.getParameterLinkedHashMap(AbstractRequestService.java:388)
	at org.springdoc.core.service.AbstractRequestService.build(AbstractRequestService.java:351)
	at org.springdoc.api.AbstractOpenApiResource.calculatePath(AbstractOpenApiResource.java:496)
	at org.springdoc.api.AbstractOpenApiResource.calculatePath(AbstractOpenApiResource.java:676)
	at org.springdoc.webmvc.api.OpenApiResource.lambda$calculatePath$11(OpenApiResource.java:219)
	at java.base/java.util.Optional.ifPresent(Optional.java:178)
	at org.springdoc.webmvc.api.OpenApiResource.calculatePath(OpenApiResource.java:200)
	at org.springdoc.webmvc.api.OpenApiResource.lambda$getPaths$2(OpenApiResource.java:170)
	at java.base/java.util.Optional.ifPresent(Optional.java:178)
	at org.springdoc.webmvc.api.OpenApiResource.getPaths(OpenApiResource.java:149)
	at org.springdoc.api.AbstractOpenApiResource.getOpenApi(AbstractOpenApiResource.java:353)
	at org.springdoc.webmvc.api.OpenApiResource.openapiJson(OpenApiResource.java:124)
	at org.springdoc.webmvc.api.OpenApiWebMvcResource.openapiJson(OpenApiWebMvcResource.java:114)
	at org.springdoc.webmvc.api.MultipleOpenApiWebMvcResource.openapiJson(MultipleOpenApiWebMvcResource.java:95)

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions