web-dev-qa-db-ja.com

OffsetDateTimeの代わりにJava.time.Instantを使用してDateTimeを表す

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>

私はすでにtypeMappingsimportMappingsを以下のように試しましたが、生成されたコードには影響がありませんでした:

<typeMappings>DateTime=Instant</typeMappings>
<importMappings>Instant=Java.time.Instant</importMappings>
6
sromdhane

@MaksimYakidovichが言うように、実際にマッピングを追加する必要がありますが、"format" : "offset-date-time" の代わりに date-time

1
petronius

同じ問題がありましたが、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春モデルを使用しました。

1
zmeeagain