我正在尝试使用 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);
}
我自己得到了答案:
在 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
或者如果为空,则当前时间将是默认值