openApi 生成器 spring 模板省略属性的默认值

openApi generator spring template omits default values of properties

提问人:Manny 提问时间:10/14/2023 最后编辑:Manny 更新时间:10/23/2023 访问量:214

问:

我在下面附上一个基本架构。使用 editor.swagger.io 时,在展开架构详细信息时,我能够在生成的页面中查看我的属性的默认值。OAS 3.0

openapi: 3.0.3
info:
  title: API Specification
  version: 1.0.0
servers:
  - url: https://localhost
paths:
  /operation:
    post:
      operationId: run
      requestBody:
        description: Description
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Request'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Response'
        '400':
          description: Bad request
        '500':
          description: Internal Server Error
components:
  schemas:
    Request:
      type: object
      properties:
        x:
          type: number
          example: 0
          default: 2
    Response:
      type: object
      properties:
        id:
          type: integer

enter image description here

但是,当从编辑器的顶部菜单使用引擎生成服务器存根时,我注意到注释的属性没有填充。springdefaultValue@Schema

  // ...
  @JsonProperty("x")
  private BigDecimal x = new BigDecimal(2);
  // ...
  /**
   * Get x
   * @return x
   **/
  @Schema(example = "0", description = "")
  
    @Valid
    public BigDecimal getX() {
    return x;
  }

如您所见,生成的服务器类正确地实例化了默认变量。 这确实是我缺少的注释的属性。我已经看到此属性包含在 OAS 的对象中。 我想在上面的注释中看到的是如下的附加属性:defaultValue@Schema@Parameter

  @Schema(example = "0", description = "", defaultValue="2")

这是弹簧引擎模板的错误吗?

如果我的问题有一个已知的解决方案,并且维护较少,我想避免立即求助于自定义胡须模板。

swagger-ui OpenAPI 默认值 openapi生成器 大摇大摆的编辑

评论

1赞 Maksim Eliseev 10/22/2023
你在用吗?springdoc-openapi
0赞 Manny 10/23/2023
@MaksimEliseev 是的,我确实使用了 maven springdoc-openapi 依赖项。但是,我相信我的问题在此之前,因为它是 openapi-generator 插件真正省略了生成具有 defaultValue 属性的服务器类。任何帮助都是值得赞赏的。

答:

1赞 Maksim Eliseev 10/23/2023 #1

关于这个问题的一点调查

实际上,您在生成的源中有 2 个问题:

  1. 生成的接口中的注解生成得不太正确:@Parameter

    ResponseEntity<Response> run(@Parameter(in = ParameterIn.DEFAULT, description = "Description", required=true, schema=@Schema()) @Valid @RequestBody Request body);
    

    如您所见,参数设置不正确。schema

  2. 如您所述,生成的类中的注释没有参数:@SchemaRequestdefaultValue

    @Schema(example = "0", description = "")
    @Valid
    public BigDecimal getX() {
        return x;
    }
    

我尝试了 Gradle 插件(类似于 swagger codegen),结果是一样的:org.openapi.generator

  1. 注释中的参数未设置:schema@Parameter

    default ResponseEntity<Response> run(
          @Parameter(name = "Request", description = "Description", required = true) @Valid @RequestBody Request request
    ) {
        // ...
    }
    
  2. 相同的行为。


通常,类的代码是正确生成的:字段初始化为默认值。Requestx

public class Request   {
    @JsonProperty("x")
    private BigDecimal x = new BigDecimal(2);

    // ...
}

你真的需要适当的注释吗?

评论

0赞 Manny 10/24/2023
感谢您的帮助!如果没有其他答案提供关于如何解决它的其他建议,我会将赏金分配给您!注解对我来说不是一个障碍,但现在我无法通知我的服务的使用者某些参数的默认值,除非我用文本键入它,如果我更改默认值并忘记更新文本,这可能会很快失效。我知道我可以使用示例来代替,但我希望它只适用于我可能缺少的一些配置。
1赞 Maksim Eliseev 10/24/2023
@Manny,当我在一家公司工作时,我们向 API 使用者提供生成的客户端。为此,我们使用了 swagger-codegen。客户端和服务器是从文本(来自开放 API 规范)生成的,即这是“文本优先”的方法。如果您使用“文本优先”方法,我认为这是有道理的。这将迫使您记住更新文本并始终保持最新状态。
1赞 Maksim Eliseev 10/24/2023
@Manny,有两个工具:openapi-generatorswagger-codegen 都有 Maven 或 Gradle 插件,用于基于 OAS 文件的生成服务器和客户端。
1赞 Manny 10/24/2023
在这种情况下,我可能会尝试 swagger-codegen,感谢您的替代选择!维护越少越好!