带有 java spring 表达式语言的 openAPI 3.1 codegen

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

我正在尝试使用 Java Spring 编写 REST 服务,并且我想使用 openAPI 来生成我的控制器。我面临的一个问题是我无法正确生成它。原因是: 在我的 REST 服务中,我希望能够在两个日期之间进行搜索。为了简化控制器逻辑,我想将 endDate 始终设置为当前时间(LocalDateTime.now)。

OpenAPI(重要的代码片段):

          schema:
            default: 50
            type: integer
            description: The maximum number of items to return
        - in: item
          name: startDate
          schema:
            type: string
            format: date
          description: The start Date of the Items to search for
        - in: item
          name: endDate
          schema:
            type: string
            format: string
            default: "#{T(java.time.LocalDateTime).now()}"     
          description: The end Date of the Items to search for

生成命令:

java -jar openapi-generator-cli.jar generate -i item.yaml -g spring --additional-properties delegatePattern=true --skip-validate-spec

生成方法:

    default ResponseEntity<List<Item>> itemsGet(

        @Parameter(name = "limit", description = "The maximum number of items to return", in = ParameterIn.ITEM) @Valid @RequestParam(value = "limit", required = false, defaultValue = "50") Integer limit,

        @Parameter(name = "startDate", description = "The start Date of the items to search for", in = ParameterIn.ITEM) @Valid @RequestParam(value = "startDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,

        @Parameter(name = "endDate", description = "The end Date of the items to search for", in = ParameterIn.ITEM) @Valid @RequestParam(value = "endDate", required = false, defaultValue = "#{T(java.time.LocalDateTime).now()}") String endDate

    ) {

        return getDelegate().itemsGet(limit, start, startDate, endDate);

    }

我知道代码生成在技术上是正确的,但我不希望它是一种字符串类型。 但是,如果我在 yaml 规范中使用格式日期时间,它将简单地忽略默认值并且不会在方法中生成它。

总而言之,我正在寻找一种方法来获得以下输出:

    default ResponseEntity<List<Item>> itemsGet(

        @Parameter(name = "limit", description = "The maximum number of items to return", in = ParameterIn.ITEM) @Valid @RequestParam(value = "limit", required = false, defaultValue = "50") Integer limit,

        @Parameter(name = "startDate", description = "The start Date of the items to search for", in = ParameterIn.ITEM) @Valid @RequestParam(value = "startDate", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,

        @Parameter(name = "endDate", description = "The end Date of the items to search for", in = ParameterIn.ITEM) @Valid @RequestParam(value = "endDate", required = false, defaultValue = "#{T(java.time.LocalDateTime).now()}") LocalDateTime endDate

    ) {

        return getDelegate().itemsGet(limit, start, startDate, endDate);

    }
spring-restcontroller openapi-generator-cli
1个回答
0
投票

我自己得到了答案:

在 OpenAPI yaml 文件中:

- in: item
  name: endDate
  schema:
    type: string
    format: date-time
    default: "#{T(java.time.LocalDateTime).now()}"     
  description: The end Date of the Items to search for

在 Gradle 任务中:

    openApiGenerate {
...
    typeMappings = ['string+date-time': 'LocalDateTime']
    importMappings = ['LocalDateTime': 'java.time.LocalDateTime']
...

}

在 Get Request 中至少添加自己设置:

?startDate=2023-10-31T21:22:10

或者如果为空,则当前时间将是默认值

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