openApi mavenプラグイン を使用してJava REST api。
リクエストには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>
@MaksimYakidovichが言うように、実際にマッピングを追加する必要がありますが、"format" : "offset-date-time"
の代わりに date-time
同じ問題がありましたが、LocalDateTime
の代わりにInstant
を使用したいと考えました。少なくともentitiesの場合、次の作業を追加します。
<configuration>
<typeMappings>
<typeMapping>OffsetDateTime=LocalDateTime</typeMapping>
</typeMappings>
<importMappings>
<importMapping>Java.time.OffsetDateTime=Java.time.LocalDateTime</importMapping>
</importMappings>
</configuration>
つまり、LocalDateTime
のインポートが追加され、タイプformat: date-time
のyaml内のエンティティフィールドが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デリゲートパターンを使用しました。
PS2春モデルを使用しました。