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

q1qsirdb  于 2022-11-06  发布在  Spring
关注(0)|答案(2)|浏览(301)

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

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

问题的简短版本:我如何通过swagger-codegen从这个带注解的Java转换到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模板文件(mustache)为每个模型创建一个协议,当在数组中指定该协议时,JSONModel将从list / array中的数据中获取该协议以生成正确的模型。

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

这将创建一个MAAccountNSArrayAccount是对象类型,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",要么通过其他方式?

sc4hvdpw

sc4hvdpw1#

在大多数情况下,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»
2w2cym1i

2w2cym1i2#

你可以尝试下面的符号。别忘了使用你的类的包信息

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

相关问题