问题描述
我们正在使用Swagger通过Spring注释为我们的API建模:
@Operation(summary = "Creates a post for given user.")
@PostMapping("/post")
open fun createPost(
@RequestParam("userId") user: User,)
我们遇到的问题是Swagger不知道背后有逻辑,我们只传递了userId: Long
,Hibernate为此用户加载了该信息。
User
的模型包含与其他实体的几个@OnetoOne
,@ManyToOne
,@OnetoMany
关系,而Swagger用所有实体建立了User
的模型。这会导致模型庞大,并且某些Swagger文档甚至无法在浏览器中加载,因为该模型的大小为兆字节。
有没有办法告诉Swagger:
- 忽略特定实体/实体
- 实施其他类型(在这种情况下为
Long
)
理想情况是:
@Operation(summary = "Creates a post for given user.")
@PostMapping("/post")
open fun createPost(
@SwaggerType(Long::class)
@RequestParam("userId")
user: User,)
解决方法
最干净的方法是将Springfox与备用类型规则一起使用。在此处给出的示例中看不到10: https://springfox.github.io/springfox/docs/current/#springfox-spring-mvc-and-spring-boot
这使您可以用要显示给Swagger用户的任何个其他(伪)类完全替换User类,而不会通过变通方法污染模型-但仍在代码中保持透明
,可以尝试以下几种方法:
-
使用User Model继承,您可以仅使用User类仅包含userId定义SuperClass-childClass映射,并且从其继承的子类将为您保留其他属性。这样,输入内容只需很小的努力就可以成为userId。
-
使用JsonIgnore,但这在返回响应时确实很好用。
-
Swagger通过OpenAPI引入了使用请求类中特定属性的功能。可以阅读更多 https://swagger.io/docs/specification/describing-request-body/
您可以使用两个不同的类,即基本类和高级类,并且高级类在API中扩展了基本类,请使用基本类;
或者如果您不想显示该字段,则可以使用@JsonIgnore,例如:
@JsonIgnore
private String name;
因为Swagger将jackson用作json,所以如果您用jackson屏蔽字段,该字段将不会显示。
昂首阔步
您可以使用@ApiModelProperty(hidden = true)
,这是完美的方法