指定 LocalDateTime 如何存储在适用于 NoSQL 的 Azure CosmosDB 中

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

我有一个 Spring Boot 项目,使用 azure cosmos db for nosql 作为数据库,使用来自

CosmosRepository
工件的
spring-cloud-azure-starter-data-cosmos
。我的实体看起来像这样:

import java.time.LocalDateTime;

import org.springframework.data.annotation.Id;

import com.azure.spring.data.cosmos.core.mapping.Container;
import com.azure.spring.data.cosmos.core.mapping.GeneratedValue;

import lombok.Data;

@Data
@Container
public class Post {
    @Id
    @GeneratedValue
    private String id;
    private String author;
    private String content;
    private String imageUrl;
    private LocalDateTime creationTime;
}

问题是,当持久化数据时,

creationTime
出于某种原因存储为数组(例如:
"creationTime": [2024, 6, 16, 16, 51, 25, 571970017]
),而不是我希望作为默认值的ISO字符串。当使用存储库方法按时间对帖子进行排序时,这似乎会出现问题(
public List<Post> findAllByOrderByCreationTimeDesc();
)。有没有办法指定将
LocalDateTime
存储为 ISO 字符串,而无需将
creationTime
更改为
String
并手动执行此操作?我尝试过用 spring 的
creationTime
注释
@DateTimeFormat
,似乎没有效果。

spring spring-boot azure spring-data azure-cosmosdb
1个回答
0
投票

Spring Data Azure Cosmos DB 在底层使用 Jackson 以 Json 格式序列化对象。这是 Jackson 的默认行为,导致日期被保留为数字数组。

Jackson 确实支持许多不同的注释,让我们知道应该如何序列化输入和格式化输出。

选项 1 - 使用注释

您可以在模型类中使用

@JsonFormat
注释,为 Azure Cosmos DB 指定推荐 ISO 8601 格式。

@Data
@Container
public class Post {
    @Id
    @GeneratedValue
    private String id;
    private String author;
    private String content;
    private String imageUrl;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'")
    private LocalDateTime creationTime;
}

选项 2 - 覆盖应用程序属性中的默认行为

如果您希望在应用程序范围内覆盖 Jackson 的默认行为,那么您可以在

application.properties
application.yml
文件中执行此操作。

# Serialize dates as ISO 8601 strings
spring.jackson.serialization.write-dates-as-timestamps=false
spring.jackson.date-format=yyyy-MM-dd'T'HH:mm:ss.fffffff'Z'
© www.soinside.com 2019 - 2024. All rights reserved.