- 
          
 - 
                Notifications
    
You must be signed in to change notification settings  - Fork 7.3k
 
Description
Description
Using OAS 3, I have a query parameter defined as follows:
    exampleSort:
      name: sort
      description: Sort parameters for list response
      in: query
      required: false
      schema:
        type: array
        items:
          type: string
        default: 'a'However after running the generator, my controller class has the following defined as defaultValue:
@ApiParam(value = "Sort parameters for list response", defaultValue = "new ArrayList<>()") @Valid @RequestParam(value = "sort", required = false, defaultValue="new ArrayList<>()") List<String> sort
When a request is made to the service with the optional parameter missing, Spring creates a new string list and adds new ArrayList<>() as the single element of the list, so the defaulted string becomes:
List<String> sort = ["new ArrayList<>()"]
When I leave required: false but remove the default entry:
    exampleSort:
      name: sort
      description: Sort parameters for list response
      in: query
      required: false
      schema:
        type: array
        items:
          type: stringThen the result is
@ApiParam(value = "Sort parameters for list response") @Valid @RequestParam(value = "sort", required = false) List<String> sort
But in this case, Spring does not create a default value (since none was specified), so sort becomes null in the controller:
List<String> sort = null
Spring MVC expects a String as default value, but if it's meant to be a list, it could be a comma delimited list as a string "a" or at the very least, an empty string (which is parsed as an empty list).
openapi-generator version
3.2.2
OpenAPI declaration file content or url
openapi: 3.0.0
paths:
  /v1/examples:
    get:
      tags:
        - Example
      summary: Get a list of Examples
      operationId: getExamples
      parameters:
        - $ref: '#/components/parameters/exampleSort'
...
components:
  parameters:
    exampleSort:
      name: sort
      description: Sort parameters for list response
      in: query
      required: false
      schema:
        type: array
        items:
          type: string
        default: 'a'
...Command line used for generation
Gradle task
openApiGenerate {
    inputSpec = openApiInput.path
    outputDir = openApiOutputDir.path
    generatorName = 'spring'
    invokerPackage = ...
    modelPackage = ...
    apiPackage = ...
    additionalProperties = [
        'interfaceOnly'     : 'true',
        'basePackage'       : ...,
        'configPackage'     : ...,
        'sourceFolder'      : 'src/generated/java/',
        'java8'             : 'true',
        'delegatePattern'   : 'true',
        'implicitHeaders'   : 'true',
        'useTags'           : 'true',
        'booleanGetterPrefix': 'is',
    ]
}
Steps to reproduce
See description ^^
Related issues/PRs
None
Suggest a fix/enhancement
I've already deduced where this value is coming from:
AbstractJavaCodegen.toDefaultValue(Schema p) {...}
Perhaps a resolution could be to override toDefaultValue(Schema p) in SpringCodegen to implement the necessary functionality, without having to worry about the implications on other types of code generators.