我正在使用 openApi maven 插件 为 REST api 生成 java 请求/响应。
请求有一个 DateTime 属性,当我运行生成器时,我得到了表示为 java.time.OffsetDateTime 的属性的 DateTime 属性。问题是我需要将该属性表示为 java.time.Instant。
这是请求的 openApi 规范:
"DocumentDto" : {
"type" : "object",
"properties" : {
"uuid" : {
"type" : "string",
"format" : "uuid"
},
"creationDate" : {
"type" : "string",
"format" : "date-time"
}
}
}
生成的java请求:
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2019-05-21T13:07:21.639+02:00[Europe/Zurich]")
public class DocumentDto {
public static final String SERIALIZED_NAME_UUID = "uuid";
@SerializedName(SERIALIZED_NAME_UUID)
private UUID uuid;
public static final String SERIALIZED_NAME_TEST = "creationDate";
@SerializedName(SERIALIZED_NAME_TEST)
private OffsetDateTime creationDate;
}
maven插件设置:
<plugin>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>3.3.4</version>
<executions>
<execution>
<id>test-service</id>
<phase>validate</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<inputSpec>
${project.build.directory}/open-api/swagger.json
</inputSpec>
<generatorName>java</generatorName>
<validateSpec>false</validateSpec>
<generateApis>false</generateApis>
<groupId>com.test</groupId>
<artifactId>test-service</artifactId>
<modelPackage>test.model</modelPackage>
<apiPackage>test.api</apiPackage>
<configOptions>
<sourceFolder>src/gen/java/main</sourceFolder>
<dateLibrary>java8</dateLibrary>
<java8>true</java8>
</configOptions>
</configuration>
</execution>
</executions>
</plugin>
我已经尝试了如下的
typeMappings
和importMappings
,但它对生成的代码没有影响:
<typeMappings>DateTime=Instant</typeMappings>
<importMappings>Instant=java.time.Instant</importMappings>
我有同样的问题,但想使用
LocalDateTime
而不是 Instant
。添加以下工作,至少对于实体:
<configuration>
<typeMappings>
<typeMapping>OffsetDateTime=LocalDateTime</typeMapping>
</typeMappings>
<importMappings>
<importMapping>java.time.OffsetDateTime=java.time.LocalDateTime</importMapping>
</importMappings>
</configuration>
即添加了
LocalDateTime
的导入,并且 yaml 中类型为 format: date-time
的任何实体字段都映射到 LocalDateTime
。
但是,对于 api parameters,这些设置没有添加导入。 一段时间后,我放弃了,转而使用完全限定的类型,这样就不需要导入了。只需将上面的
typeMapping
更改为:
<typeMapping>OffsetDateTime=java.time.LocalDateTime</typeMapping>
您生成的方法随后如下所示:
default ResponseEntity<List<SomeDto>> someMethodGet(
@ApiParam(value = "") @Valid @RequestParam(value = "changeDateFrom",
required = false) @org.springframework.format.annotation.DateTimeFormat(
iso = org.springframework.format.annotation.DateTimeFormat.ISO.DATE_TIME) java.time.LocalDateTime changeDateFrom,
{
return getDelegate().someMethodGet(..., changeDateFrom, ...);
}
PS1 确保您使用最新版本的插件。
PS2 我使用了委托模式。
PS3我用的是弹簧型号。
只需添加到 openapi-generator-maven-plugin 的配置中
<typeMappings>
<typeMapping>OffsetDateTime=Instant</typeMapping>
</typeMappings>
<importMappings>
<importMapping>java.time.OffsetDateTime=java.time.Instant</importMapping>
</importMappings>
您的更改将被生成器的
dateLibrary
配置覆盖。
要覆盖 date
或 date-time
格式类型,您最好通过指定 java 生成器无法识别的值来禁用 dateLibrary
。
将此添加到您的插件的
<configuration>
以实现此目的:
<configOptions>
<java8>true</java8>
<dateLibrary>custom</dateLibrary>
</configOptions>
<typeMappings>
<typeMapping>DateTime=Instant</typeMapping>
<typeMapping>Date=LocalDate</typeMapping>
</typeMappings>
<importMappings>
<importMapping>Instant=java.time.Instant</importMapping>
<importMapping>LocalDate=java.time.LocalDate</importMapping>
</importMappings>
您可能还想添加
<jsr310>true</jsr310>
配置选项,因为当 dateLibrary 为 java8
时它会自动启用(但据我所知,这主要在生成客户端时使用)。
我知道问题是关于
openapi-generator-maven-plugin
的,但是由于寻找 org.openapi.generator
gradle 插件的相同配置将我带到这里,我想这对其他人可能有用:
org.openapi.generator
gradle 插件的等效项是:
openApiGenerate {
// ...
typeMappings = [
OffsetDateTime: "Instant"
]
importMappings = [
"java.time.OffsetDateTime": "java.time.Instant"
]
}
您确实必须按照 @MaksimYakidovich 所说添加映射,但也要更改您的规范
"format" : "offset-date-time"
而不是date-time