gpt4 book ai didi

java - 如何在 LocalDateTime 和 LocalDate for Java 上配置 Jackson 序列化?

转载 作者:行者123 更新时间:2023-12-01 07:18:03 24 4
gpt4 key购买 nike

我知道 Stackoverflow 上有很多关于这个主题的帖子,我确信我已经阅读了所有这些帖子,但我仍然在努力让这个工作正常进行,并且希望得到任何指导。

这是我正在使用的 Spring Parent 和 Jackson 依赖项:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>

<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

在我的应用程序配置中,我尝试使用:

@Autowired
void configureJackson(ObjectMapper jackson2ObjectMapper) {

JavaTimeModule timeModule = new JavaTimeModule();

timeModule.addDeserializer(LocalDate.class,
new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));

timeModule.addDeserializer(LocalDateTime.class,
new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

timeModule.addSerializer(LocalDate.class,
new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));

timeModule.addSerializer(LocalDateTime.class,
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

jackson2ObjectMapper
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
.registerModule(timeModule)
.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module())
.registerModule(new JtsModule());
}

这是我正在测试的模型。 (我正在尝试在 5-6 个模型中实现相同的目标)。

public class DateRange implements Serializable {

private static final long serialVersionUID = 6412487507434252330L;

private LocalDateTime startTime;
private LocalDateTime endTime;

private LocalDate startDate;
private LocalDate endDate;

// Getters/Setters

我希望能够找到一种适用于全局的方法,而无需我单独注释每个字段。我之前使用过 java.util.Date,但遇到了其他功能的一些问题。

尝试使用这些更新(更好)的日期模型而不是旧的损坏模型,这让我对一件简单的事情感到非常头疼。

<小时/>

更新

我将配置更改为下面建议的配置之一,并且非常接近解决此问题。

@Bean
@Primary
public ObjectMapper objectMapper() {

JavaTimeModule timeModule = new JavaTimeModule();

timeModule.addDeserializer(LocalDate.class,
new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));

timeModule.addDeserializer(LocalDateTime.class,
new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

timeModule.addSerializer(LocalDate.class,
new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));

timeModule.addSerializer(LocalDateTime.class,
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

return new ObjectMapper()
//.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
.registerModule(timeModule)
.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module())
.registerModule(new JtsModule());
}

现在我遇到的唯一问题是 LocalDateTime 正在打印时间戳,例如:“2018-07-26T07:57:12.938”,当我需要它们时,例如:2018-07-26 07:57:12。

这些字段今天已经投入使用,我需要以不需要我的 API 使用者进行任何调整的方式无缝地进行此更改。

Cassio提到禁用 SerializationFeature.WRITE_DATES_AS_TIMESTAMPS 将以这种 ISO 格式打印时间戳,但这不是我需要的。我尝试注释掉该字段,希望它能够拾取我提供的自定义 DateTimeFormatter,但它并没有改变我的输出。

最佳答案

JavaTimeModule将为您做艰苦的工作。它提供了一组serializersdeserializersjava.time类型。如果SerializationFeature.WRITE_DATES_AS_TIMESTAMPS已禁用,java.time类型将在标准 ISO-8601 中序列化字符串表示。

<小时/>

默认情况下,Spring会为您提供ObjectMappper的实例由 Jackson2ObjectMapperBuilder 创建。该实例是自动为您配置的。查看类(class)documentation了解详情。

如果你想替换默认的ObjectMapper完全可以,要么定义 @Bean该类型并将其标记为 @Primary :

@Bean
@Primary
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return mapper;
}

或者,如果您更喜欢基于构建器的方法,请定义 Jackson2ObjectMapperBuilder @Bean

@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.modules(new JavaTimeModule());
builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return builder;
}

请注意,无论哪种情况,这样做都会禁用 ObjectMapper 的所有自动配置。 。请参阅documentation了解详情。

关于java - 如何在 LocalDateTime 和 LocalDate for Java 上配置 Jackson 序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51527794/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com