从Swagger模型中排除实体

问题描述

我们正在使用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类,而不会通过变通方法污染模型-但仍在代码中保持透明

,

可以尝试以下几种方法:

  1. 使用User Model继承,您可以仅使用User类仅包含userId定义SuperClass-childClass映射,并且从其继承的子类将为您保留其他属性。这样,输入内容只需很小的努力就可以成为userId。

  2. 使用JsonIgnore,但这在返回响应时确实很好用。

  3. Swagger通过OpenAPI引入了使用请求类中特定属性的功能。可以阅读更多 https://swagger.io/docs/specification/describing-request-body/

,

您可以使用两个不同的类,即基本类和高级类,并且高级类在API中扩展了基本类,请使用基本类;

或者如果您不想显示该字段,则可以使用@JsonIgnore,例如:

@JsonIgnore
private String name;

因为Swagger将jackson用作json,所以如果您用jackson屏蔽字段,该字段将不会显示。

昂首阔步 您可以使用@ApiModelProperty(hidden = true),这是完美的方法