使用java.time.Instant来表示DateTime而不是OffsetDateTime

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

我正在使用 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>
java swagger openapi openapi-generator
5个回答
39
投票

我有同样的问题,但想使用

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我用的是弹簧型号。


32
投票

只需添加到 openapi-generator-maven-plugin 的配置中

<typeMappings>
     <typeMapping>OffsetDateTime=Instant</typeMapping>
</typeMappings>
<importMappings>                                
     <importMapping>java.time.OffsetDateTime=java.time.Instant</importMapping>
</importMappings>

17
投票

您的更改将被生成器的

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
时它会自动启用(但据我所知,这主要在生成客户端时使用)。


11
投票

我知道问题是关于

openapi-generator-maven-plugin
的,但是由于寻找
org.openapi.generator
gradle 插件的相同配置将我带到这里,我想这对其他人可能有用:

org.openapi.generator
gradle 插件的等效项是:

openApiGenerate {
    // ...
    typeMappings = [
        OffsetDateTime: "Instant"
    ]
    importMappings = [
        "java.time.OffsetDateTime": "java.time.Instant"
    ]
}

2
投票

您确实必须按照 @MaksimYakidovich 所说添加映射,但也要更改您的规范

"format" : "offset-date-time"
而不是
date-time

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