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

问题描述 投票:0回答:3

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

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

问题的简短版本:我怎样才能从这个带注释的Java到例如通过 swagger-codegen 实现 Objective C?

由此生成的 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;

这将创建

NSArray
MAAccount
Account
是对象类型,
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"
或通过任何其他方式?

java spring-mvc swagger springfox
3个回答
4
投票

在大多数情况下,swagger 注释只是 springfox 引擎的一个辅助工具,用于推断有关类型的附加信息,例如描述/隐藏/只读等,而这些信息是类型系统无法获得的。它还可以用作表示不容易推断的类型的拐杖。数据类型可以被覆盖,但只是为了类型安全,正如评论中指出的那样。

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

像@CupawnTae建议的那样,springfox的2.x版本支持使用代码生成友好且与语言无关的泛型类型表示来呈现泛型类型的选项。

创建/配置您的摘要时,您需要使用

forCodeGeneration
选项指定渲染的 swagger 服务描述需要代码生成友好

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

这将导致 springfox 渲染通用类型,如

List<String>

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

0
投票

您可以尝试下面的记号。不要忘记使用你班级的包信息

@ApiModelProperty(dataType = "[Lyour.package.Account;")
private List<Account> accounts;

0
投票

谢谢,你拯救了我的一天,我尝试了chatgpt,但它无法帮助我

© www.soinside.com 2019 - 2024. All rights reserved.