当前位置: 首页 > 知识库问答 >
问题:

使用java。时间Instant表示DateTime而不是OffsetDateTime

长孙承嗣
2023-03-14

我正在使用openApi maven插件为RESTAPI生成java请求/响应。

该请求有一个DateTime属性,当我运行生成器时,我会获得表示为java的属性的DateTime属性。时间OffsetDateTime。问题是我需要将属性表示为java。时间瞬间

这是请求的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进口映射,如下所示,但它对生成的代码没有影响:

<typeMappings>DateTime=Instant</typeMappings>
<importMappings>Instant=java.time.Instant</importMappings>

共有3个答案

吕利
2023-03-14

您的更改将被生成器的日期库配置覆盖。要覆盖日期或日期时间格式类型,最好通过指定java生成器无法识别的值来禁用日期库。

将此添加到插件的<代码>

  <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>

您可能还需要添加<代码>

狄新立
2023-03-14

有同样的问题,但想使用LocalDateTime而不是Instant。添加以下工作,至少针对实体:

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

即添加了LocalDateTime的导入,并且yaml中类型为格式为:date-time的任何实体字段都映射到LocalDateTime

然而,对于api参数,这些设置没有添加导入。过了一段时间,我放弃了,取而代之的是使用完全限定的类型,因此不需要导入。只需将上述类型映射更改为:

<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我使用了Spring模型。

都昊乾
2023-03-14

只需添加到openapi生成器maven插件的配置

<typeMappings>
     <typeMapping>OffsetDateTime=Instant</typeMapping>
</typeMappings>
<importMappings>                                
     <importMapping>java.time.OffsetDateTime=java.time.Instant</importMapping>
</importMappings>
 类似资料:
  • 问题内容: 在Microsoft Spec中,表示为2个32位整数:和 参考:https : //docs.microsoft.com/zh- cn/openspecs/windows_protocols/ms- dtyp/cca27429-5689-4a16-b2b4-9325d93e4ba2 FILETIME结构是一个64位值,表示自1601年1月1日(协调世界时)以来已过去的100纳秒间隔数

  • 尝试跳过application.properties文件中安全约束的使用: 在Java安全和Spring配置中: 但它们随后被忽视了。 我的文件: 我的Spring Security配置: 我使用的是Spring Boot和Keyclope适配器 更新:根据下面提供的答案,我用唯一的依赖项配置了KeyClope安全性:

  • 问题内容: 我的实体当前包含java Date属性。我开始非常频繁地将Joda Time用于日期处理和计算。这意味着我一直必须将Dates转换为Joda DateTime对象,然后再次转换。 所以我想知道,有什么理由不应该仅更改我的实体来存储Joda DateTime对象而不是Java Date对象吗? 请注意,这些实体通过Hibernate保留。我找到了jodatime-hibernate项目,

  • 我正在学习使用MapStruct。 我有以下自定义映射配置,以这种方式将从JPA实体映射到DTO: 我对这个解决方案的问题是中的Java代码实际上是一个字符串,IDE(例如IntelliJ)没有检查这个“java”代码的语法。也许在重构之后,这段代码将不再工作,因为我重命名了相关字段。 如果我在表达式中添加一个检查,那么这段代码会更长,更长的代码可能会有更多的打字错误。 我可以在这里写一个真正的j

  • 问题内容: 我有一个列(格式),指定票的到期日,现在我需要得到“由于今天的门票基地之间的比较有。即vs 在这件事上将返回true。 问题答案: 使用比较日期 将为您提供当前日期的日期部分,并为您提供到期日的日期部分。然后您可以轻松比较日期 所以你可以像这样比较 要么 看这里

  • 问题内容: 我对php比较陌生。有一件非常基本的事情困扰着我。我了解php用于使网站动态化。我也了解php是可用于创建动态网站的许多服务器端脚本语言之一。 但是,我不明白的是,何时需要使用index.php页面。例如,如果我的索引页面上只有一个简单的登录页面,那么它也可能只是一个简单的html页面。对?那我为什么要使它成为index.php而不是index.html? 一个示例情况的例子将是很好的