Swagger-codegen: Unable to follow/detect model reference in another file ($ref)

Created on 25 Oct 2017  路  7Comments  路  Source: swagger-api/swagger-codegen

Description

Using the simple petstore sample split into files, swagger-codegen is unable to generate any of the models.

During the generation, I receive this log for each model:

[main] WARN io.swagger.codegen.examples.ExampleGenerator - Ref property with empty model.
[main] WARN io.swagger.codegen.examples.ExampleGenerator - Ref property with empty model.
[main] WARN io.swagger.codegen.examples.ExampleGenerator - Ref property with empty model.

Here is my swagger.yaml

swagger: '2.0'
info:
  version: '1.0.0'
  title: Swagger Petstore (Simple)
  description: A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification
  termsOfService: http://helloreverb.com/terms/
  contact:
    name: Swagger API team
    email: [email protected]
    url: http://swagger.io
  license:
    name: MIT
    url: http://opensource.org/licenses/MIT
host: petstore.swagger.io
basePath: /api
schemes:
  - http
consumes:
  - application/json
produces:
  - application/json
paths:
  /pets:
    get:
      description: Returns all pets from the system that the user has access to
      operationId: findPets
      produces:
        - application/json
        - application/xml
        - text/xml
        - text/html
      parameters:
        - name: tags
          in: query
          description: tags to filter by
          required: false
          type: array
          items:
            type: string
          collectionFormat: csv
        - name: limit
          in: query
          description: maximum number of results to return
          required: false
          type: integer
          format: int32
      responses:
        '200':
          description: pet response
          schema:
            type: array
            items:
              $ref: 'definitions.yaml#/definitions/pet'
        default:
          description: unexpected error
          schema:
            $ref: 'definitions.yaml#/definitions/errorModel'
    post:
      description: Creates a new pet in the store.  Duplicates are allowed
      operationId: addPet
      produces:
        - application/json
      parameters:
        - name: pet
          in: body
          description: Pet to add to the store
          required: true
          schema:
            $ref: 'definitions.yaml#/definitions/newPet'
      responses:
        '200':
          description: pet response
          schema:
            $ref: 'definitions.yaml#/definitions/pet'
        default:
          description: unexpected error
          schema:
            $ref: 'definitions.yaml#/definitions/errorModel'
  /pets/{id}:
    get:
      description: Returns a user based on a single ID, if the user does not have access to the pet
      operationId: findPetById
      produces:
        - application/json
        - application/xml
        - text/xml
        - text/html
      parameters:
        - name: id
          in: path
          description: ID of pet to fetch
          required: true
          type: integer
          format: int64
      responses:
        '200':
          description: pet response
          schema:
            $ref: 'definitions.yaml#/definitions/pet'
        default:
          description: unexpected error
          schema:
            $ref: 'definitions.yaml#/definitions/errorModel'
    delete:
      description: deletes a single pet based on the ID supplied
      operationId: deletePet
      parameters:
        - name: id
          in: path
          description: ID of pet to delete
          required: true
          type: integer
          format: int64
      responses:
        '204':
          description: pet deleted
        default:
          description: unexpected error
          schema:
            $ref: 'definitions.yaml#/definitions/errorModel'

And here is the definitions.yaml file

definitions:
  pet:
    type: object
    required:
      - id
      - name
    properties:
      id:
        type: integer
        format: int64
      name:
        type: string
      tag:
        type: string
  newPet:
    type: object
    required:
      - name
    properties:
      id:
        type: integer
        format: int64
      name:
        type: string
      tag:
        type: string
  errorModel:
    type: object
    required:
      - code
      - message
    properties:
      code:
        type: integer
        format: int32
      message:
        type: string

Swagger-codegen version

Latest master

Command line used for generation

java -jar swagger-codegen-cli.jar generate -i swagger.yaml -l java-play-framework -o generatedServer -DhideGenerationTimestamp=true

Steps to reproduce

Just run the command line above

Suggest a fix/enhancement

My swagger.yaml and definitions.yaml files are valid and load without problem in swagger-ui.
Is there any limitation in swagger-codegen preventing the use of multiple files?

Most helpful comment

@tony-gutierrez have you tried adding "./" instead?

e.g $ref: './definitions.yaml#/definitions/errorModel'

All 7 comments

It seems like basically no swagger tools other than the old version of the editor(editor2) and swaggerui actually support external refs.

@tony-gutierrez : If that is true, then I guess I will have to stick with my method to bundle all my yaml files to a single json and do the generation from this json file.
@wing328 : Can you confirm this?

I'm by no means an official source, i have just been spending the last hour trying to generate any possible code in any language, from a multi file spec, with no results. I know the current editor tool for spec 3 does not work with external refs.

@tony-gutierrez : Yeah I got the same feeling in my own experience. @wing328 is an official source and we should be fixed when he will answer.

I'm closing this since all of theses problems are in the swagger-parser project. I have created the related issue in this project and will keep track of them in the swagger-parser project from now on.

@tony-gutierrez have you tried adding "./" instead?

e.g $ref: './definitions.yaml#/definitions/errorModel'

Sorry to necro this post; I can get './' working fine, but when I try and reference folders with '../' I get 'Could not find ../definitions/someFile.yml on the classpath' . I thought maybe bringing it onto the classpath would flatten, so have tried ./, #/, no folder and all variations I could think of to no avail.

Was this page helpful?
0 / 5 - 0 ratings