OpenAPITools / openapi-generator

OpenAPI Generator allows generation of API client libraries (SDK generation), server stubs, documentation and configuration automatically given an OpenAPI Spec (v2, v3)
https://openapi-generator.tech
Apache License 2.0
21.81k stars 6.58k forks source link

[BUG][Java][Spring] Different in-parameter types generated for api and delegate for binary (application/octet-stream) #9331 breaks outparameter #9462

Closed beckerjohannes closed 3 years ago

beckerjohannes commented 3 years ago

Bug Report Checklist

Description

The breaking change introduced in #9331 (in a fix version!) applies not only to in-Parameters but also to out-Parameters. The result is that 5.1.1 cannot be applied for projects having application/octet-stream as response parameters. It is not only a breaking change (requiring source code change) the results in compile errors, these errors cannot be fixed, as MultipartFile is not a valid return value.

After the Change the generated API is this:

    /**
     * GET /downloadFile/{fileId} : File for an ID
     * Retrieves file.
     *
     * @param fileId Numeric ID of the file. (required)
     * @return OK (status code 200)
     */
    @ApiOperation(value = "File for an ID", nickname = "getFile", notes = "Retrieves file.", response = org.springframework.web.multipart.MultipartFile.class, tags={ "files", })
    @ApiResponses(value = { 
        @ApiResponse(code = 200, message = "OK", response = org.springframework.web.multipart.MultipartFile.class) })
    @GetMapping(
        value = "/downloadFile/{fileId}",
        produces = { "application/octet-stream" }
    )
    default ResponseEntity<org.springframework.web.multipart.MultipartFile> getFile(@ApiParam(value = "Numeric ID of the file.",required=true) @PathVariable("fileId") Long fileId) {
        return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

    }

Before Version 5.1.1 it was:

default ResponseEntity<org.springframework.core.io.Resource> getFile(@ApiParam(value = "Numeric ID of the file.",required=true) @PathVariable("fileId") Long fileId) 

However, the newly generated interface contract cannot be satisfied in a clean way, as MultipartFile is not supposed to be a return value. See Spring documentation of MultipartFile

A representation of an uploaded file received in a multipart request.

The file contents are either stored in memory or temporarily on disk. In either case, the user is responsible for copying file contents to a session-level or persistent store as and if desired. The temporary storage will be cleared at the end of request processing.

openapi-generator version

5.1.1

OpenAPI declaration file content or url
get:
  tags:
    - files
  summary: File for an ID
  description: Retrieves file.
  operationId: getFile
  parameters:
    - in: path
      name: fileId
      schema:
        type: integer
        format: int64
      required: true
      description: Numeric ID of the file.
  responses:
    200:
      description: OK
      content:
        application/octet-stream:
          schema:
            type: string
            format: binary
Generation Details

Generation with openapi-generator-maven-plugin

                            <!-- specify the OpenAPI spec -->
                            <inputSpec>dipa-hub.yaml</inputSpec>
                            <enablePostProcessFile>false</enablePostProcessFile>

                            <generatorName>spring</generatorName>
                            <additionalProperties>removeEnumValuePrefix=false</additionalProperties>

                            <configOptions>
                                <apiPackage>online.dipa.hub.api.rest</apiPackage>
                                <modelPackage>online.dipa.hub.api.model</modelPackage>
                                <interfaceOnly>true</interfaceOnly>
                                <generateSupportingFiles>false</generateSupportingFiles>
                                <generateModelTests>false</generateModelTests>
                                <generateModelDocumentation>false</generateModelDocumentation>
                                <generateApiDocumentation>false</generateApiDocumentation>
                                <generateApiTests>false</generateApiTests>
                                <serializableModel>true</serializableModel>
                                <snapshotVersion>true</snapshotVersion>
                                <useTags>true</useTags>
                            </configOptions>
Steps to reproduce

See compile errors in the following PR https://github.com/DiPA-Projekt/dipa-hub/pull/300

Related issues/PRs

Introduced in #9331

Suggest a fix

Ensure that #9331 is only applied to in parameters and not to response parameters.

beckerjohannes commented 3 years ago

This is even more concerning as 5.1.0 currently produces dependabot security alerts: image

beckerjohannes commented 3 years ago

Any comments? @agilob @wing328