Search code examples
swaggerswagger-codegenswagger-editor

swagger-codegen is not correctly generating common parameters for any language


According to the swagger documentation, I should be able to have common parameters that are shared by all operations. The problem is that when running codegen locally, the generated code does not have any of the common path parameters. The below yaml produces code for any language (I've tried two).

What is very confusing is that if I use this exact yaml in https://editor.swagger.io/, the generated code does have the path parameters. I ran this for two different languages, typescript:

image

And C#:

image

Left is the code generated in editor.swagger.io and right is my generated code by running codegen locally.

In both cases, the .swagger-codegen\VERSION the file is 3.0.20 which is the one I'm using but the code generated by https://editor.swagger.io/ does have the parameter paths.

This simple yaml file reproduces the issue:

openapi: 3.0.2
info:
    title: title
    version: 1.0.0
paths:
    '/instances/{id}':
        summary: Manipulate a particular instance
        get:
            responses:
                '200':
                    description: Ok
                    content:
                        text/plain:
                          schema:
                            type: string
                            example: pong
            summary: Fetches an instance
        parameters:
            -   in: path
                name: id
                schema:
                    type: integer
                required: true
components:
    securitySchemes:
        bearerAuth:
            scheme: bearer
            bearerFormat: JWT
            type: http

The command line used for generation:

java   ^
    -classpath bin/swagger-codegen-cli.jar                                      ^
    -DdebugOperations                                                           ^
    io.swagger.codegen.v3.Codegen                                               ^
    generate                                                                    ^
    -i enterpos-api.yaml                                                        ^
    -l typescript-angular                                                       ^
    -o generated-code/typescript-angular-builtin

And that generated this output: https://gist.github.com/alanboy/45ce792255e079dd0de4f70449ebf455. I feel like this might be wrong usage or something wrong with my yaml but I can't figure out what.


Solution

  • The problem is the Main class. I noticed that using the io.swagger.codegen.v3.Codegen class produces incorrect results :

    java -classpath bin/swagger-codegen-cli.jar  io.swagger.codegen.v3.Codegen  <more>
                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

    But this works:

    java -jar bin/swagger-codegen-cli.jar <more>
    

    Which led me to open MANIFEST.MF in the jar and notice the main class is actually this:

    Main-Class: io.swagger.codegen.v3.cli.SwaggerCodegen
    

    I then ran the command like this and everything worked as expected.

    java -classpath bin/swagger-codegen-cli.jar  io.swagger.codegen.v3.cli.SwaggerCodegen  <more>
                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^