首页 文章

如何在swagger-spring-mvc中为swagger-codegen表示具有类似List <Something>的泛型类型的字段

提问于
浏览
2

我正在使用swagger-spring-mvc 0.9.5并在我的响应数据中有这样的字段:

@ApiModelProperty("Some description")
private List<Account> accounts;

问题的简短版本: how can I get from this annotated Java to e.g. Objective C via swagger-codegen?

由此生成的swagger JSON是:

accounts: {
  description: "Some description",
  items: {
    type: "Account"
  },
  required: false,
  type: "List"
}

我的同事正在将它转换为swagger-codegen来生成Objective C类,并且它生成的代码不能编译 .

@property (nonatomic, strong) NSArray<Optional, NSArray> *accounts;

因为 NSArray< > 内部)不是协议 .

swagger模板文件(小胡子)为每个模型创建一个协议 . 在数组上指定该协议时,JSONModel会选择该协议,以从列表/数组中的数据生成正确的模型 . 所以在这种情况下,预期的输出是

@property (nonatomic, strong) NSArray<Optional, MAAccount> *accounts;

这将创建一个 NSArrayMAAccountAccount 是对象类型, MA 是swagger已有的前缀) .

如果我们手动编辑swagger JSON以将 List 更改为 array (如各种类似情况所示),则输出正确,但我们希望避免此手动步骤 .

所以我试图让swagger-spring-mvc使用 "array"

@ApiModelProperty(value = "Some description", dataType = "array")
private List<Account> accounts;

但后来发现 dataType 在swagger-spring-mvc 0.9.5中被忽略了,从它的外观看,在springfox 2.0中它被忽略,除非它是一个完全限定的Java类名 .

有没有办法实现这一点,要么通过使用swagger-spring-mvc / springfox来使用 "array" 或通过任何其他方式?

1 回答

  • 1

    在大多数情况下,swagger注释只是对springfox引擎的帮助,以推断有关类型系统无法提供的类型(如description / hidden / readonly等)的其他信息 . 它还可以用作拐杖来表示不容易推断的类型 . 可以覆盖数据类型,但只是为了类型安全,因为它在注释中指出 .

    具体来说,我读到dataType将被忽略,除非它是一个完全限定的类名 .

    与@CupawnTae建议一样,version 2.x of springfox支持使用代码生成友好和泛型类型的语言无关表示来呈现泛型类型的选项 .

    在创建/配置文件夹时,您需要使用 forCodeGeneration 选项指定渲染的swagger服务描述需要代码生成友好

    @Bean
    public Docket docket() {
        return new Docket(DocumentationType.SWAGGER_2)
          ...
          .forCodeGeneration(true)
          ...;
    }
    

    这将导致springfox呈现泛型类型,如 List<String>

    forCodeGeneration 设置为true时

    • ListOfString
      forCodeGeneration 设置为false时
    • List«String»

相关问题