我遇到了Swagger YAML和代码生成的问题 .

我试图从这个非常简单的代码片段生成代码:

swagger: '2.0'
info:
  version: 1.0.0
  title: Number API
host: localhost
basePath: /v2
schemes:
- http
paths:
  '/numbers':
    get:
      summary: Get number
      description: Returns a number
      operationId: getNumber
      produces:
      - application/json
      responses:
        '200':
          description: successful operation
          schema:
            $ref: '#/definitions/Numbers'
definitions:
  Numbers:
    $ref: '#/definitions/Number'
  Number:
    type: number

我使用swagger-codegen-cli-2.2.3.jar执行以下命令:

java -jar swagger-codegen-cli-2.2.3.jar generate -i swagger.yaml -l jaxrs-spec -o ./

现在,预期的输出是一个非常简单的API实现,其中/ numbers endpoints 的响应是BigDecimal . 我得到这个,如果我使用Swagger Editor,它使用Swagger generator .

但是,使用上面的命令,我得到一个API实现,其中响应尝试返回一个名为“Numbers”的模型 . 模型实现如下所示:

package io.swagger.model;

import javax.validation.constraints.*;


import io.swagger.annotations.*;
import java.util.Objects;


public class Numbers   {



  @Override
  public boolean equals(java.lang.Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    Numbers numbers = (Numbers) o;
    return true;
  }

  @Override
  public int hashCode() {
    return Objects.hash();
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class Numbers {\n");

    sb.append("}");
    return sb.toString();
  }

  /**
   * Convert the given object to string with each line indented by 4 spaces
   * (except the first line).
   */
  private String toIndentedString(java.lang.Object o) {
    if (o == null) {
      return "null";
    }
    return o.toString().replace("\n", "\n    ");
  }
}

这是不正确的,因为Numbers对象应该只是转换为BigDecimal,就像Swagger Generator正在做的那样 .

任何人都可以向我解释为什么会发生这种情况,以及我可以做些什么来使generator-cli按预期运行?

EDIT: 我查看了editor.swagger.io和codegen-cli生成的JSON . editor.swagger.io中的JSON随生成的代码一起出现在ZIP存档中 . 它看起来像这样:

JSON output from Swagger editor JAXRS-SPEC:

{
  "swagger" : "2.0",
  "info" : {
    "version" : "1.0.0",
    "title" : "Number API"
  },
  "host" : "localhost",
  "basePath" : "/v2",
  "schemes" : [ "http" ],
  "paths" : {
    "/numbers" : {
      "get" : {
        "summary" : "Get number",
        "description" : "Returns a number",
        "operationId" : "getNumber",
        "produces" : [ "application/json" ],
        "parameters" : [ ],
        "responses" : {
          "200" : {
            "description" : "successful operation",
            "schema" : {
              "type" : "number"
            }
          }
        }
      }
    }
  },
  "definitions" : {
    "Numbers" : {
      "type" : "number"
    },
    "Number" : {
      "type" : "number"
    }
  }
}

而codegen-cli生成的JSON如下所示:

JSON from codegen-cli v2.2.3, v2.3.0, github master and all other version of codegen-cli

{
  "swagger" : "2.0",
  "info" : {
    "version" : "1.0.0",
    "title" : "Number API"
  },
  "host" : "localhost",
  "basePath" : "/v2",
  "schemes" : [ "http" ],
  "paths" : {
    "/numbers" : {
      "get" : {
        "summary" : "Get number",
        "description" : "Returns a number",
        "operationId" : "getNumber",
        "produces" : [ "application/json" ],
        "parameters" : [ ],
        "responses" : {
          "200" : {
            "description" : "successful operation",
            "schema" : {
              "$ref" : "#/definitions/Numbers"
            }
          }
        }
      }
    }
  },
  "definitions" : {
    "Numbers" : {
      "$ref" : "#/definitions/Number"
    },
    "Number" : {
      "type" : "number"
    }
  }
}

因此,在Swagger编辑器版本中,refs被转换为简单类型,而refs保留在codegen-cli版本中 .