我有一个 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 Data Azure Cosmos DB 在底层使用 Jackson 以 Json 格式序列化对象。这是 Jackson 的默认行为,导致日期被保留为数字数组。
Jackson 确实支持许多不同的注释,让我们知道应该如何序列化输入和格式化输出。
您可以在模型类中使用
@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;
}
如果您希望在应用程序范围内覆盖 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'