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][SPRING]compilation errors due to different request body type in api and apiDelegate files #3905

Open anuhyapolisetti opened 5 years ago

anuhyapolisetti commented 5 years ago

Bug Report Checklist

Description

We have encountered this problem generated Api and ApiDelegate files have different request body types (Resource/MultipartFile), which is resulting in compilation errors.

Issue seemed to have addressed in v4.0.0-beta3 version, but issue still persists when we tried with the cli version of v4.0.0-beta3.

openapi-generator version

v4.0.2

OpenAPI declaration file content or url
openapi: 3.0.1
info:
  title: testapp
  version: 0.0.1
servers:
  - url: 'http://localhost:8081/api'
    description: Development server
paths:
  '/foo':
    post:
      operationId: foo
      requestBody:
        content:
          image/png:
            schema:
              type: string
              format: binary
      responses:
        default:
          description: successful operation
Command line used for generation

java -jar openapi-generator-cli.jar generate -g spring -i api.yml -o ./out --additional-properties delegatePattern=true

Steps to reproduce
  1. Run the command above with provided api.yml.

  2. Open out/src/main/java/org/openapitools/api/FooApi.java, look at generated foo method

    default ResponseEntity<Void> foo(@ApiParam(value = ""  )  @Valid @RequestBody Resource body) {
        return getDelegate().foo(body);
    }
  3. Open out/src/main/java/org/openapitools/api/FooApiDelegate.java, look at generated apiDelegate method

    default ResponseEntity<Void> foo(MultipartFile body) {
        return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);
    }

    foo from FooApiDelegate consumes MultipartFile whereas FooApi passes Resource as request body type.

Related issues/PRs
  1. https://github.com/OpenAPITools/openapi-generator/pull/2271

Issue seemed to have addressed in v4.0.0-beta3 version per above PR, but issue still persists when we tried with the cli version of v4.0.0-beta3.

  1. https://github.com/OpenAPITools/openapi-generator/issues/2191
Suggest a fix

Use either Multipartfile or Resource in both api and apidelegate

auto-labeler[bot] commented 5 years ago

👍 Thanks for opening this issue! 🏷 I have applied any labels matching special text in your issue.

The team will review the labels and make any necessary changes.

nickshoe commented 5 years ago

I'm experiencing the same problem with version 4.1.3 (in a JHipster API-first project).

operation:

/attachments:
  post:
    description: Creates a new Attachment by a file upload
    operationId: createAttachment
    requestBody:
      content:
        application/octet-stream:
          schema:
            $ref: '#/components/schemas/AttachmentFile'

schema:

AttachmentFile:
  type: string
  format: binary

generated "...ApiDelegate" interface method:

default ResponseEntity<Attachment> createAttachment(MultipartFile body) { ... }

generated "...Api" interface method:

default ResponseEntity<Attachment> createAttachment(@ApiParam(value = ""  )  @Valid @RequestBody Resource body) {
    return getDelegate().createAttachment(body);
}
saephir commented 4 years ago

I'm dropping this workaround just in case:

Define typeMapping in pom.xml (or analogous Gradle config):

<typeMappings>binary-string=org.springframework.core.io.Resource</typeMappings>

and use binary-string in the OpenAPI specification:

requestBody:
  content:
    application/octet-stream:
      schema:
        type: binary-string
d-j-kendall commented 2 years ago
<typeMappings>binary-string=org.springframework.core.io.Resource</typeMappings>

Life saver my guy, I've been looking all over for a workaround as this issue is still present in 5.4.0