作者:宫金丹865 | 来源:互联网 | 2022-12-09 15:50
我知道在Stackoverflow上有很多与此主题相关的文章,我敢肯定我已经阅读了所有这些文章,但是我仍在努力使这项工作正常进行,并且希望获得任何指导。
这是我正在使用的Spring Parent和Jackson依赖关系:
org.springframework.boot
spring-boot-starter-parent
1.5.9.RELEASE
com.fasterxml.jackson.module
jackson-module-parameter-names
com.fasterxml.jackson.datatype
jackson-datatype-jdk8
com.fasterxml.jackson.datatype
jackson-datatype-jsr310
在我的应用程序配置中,我尝试使用:
@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使用者进行任何调整的无缝方式进行此更改。
卡西欧提到禁用SerializationFeature.WRITE_DATES_AS_TIMESTAMPS会以这种ISO格式打印时间戳,但这不是我所需要的。我试图注释掉该字段,希望它能提取我提供的自定义DateTimeFormatter,但是它并未更改我的输出。
1> cassiomolin..:
该JavaTimeModule
会做艰苦的工作适合你。它为这些类型提供了一组序列化器和反序列化器java.time
。如果SerializationFeature.WRITE_DATES_AS_TIMESTAMPS
被禁用,java.time
类型将在标准被序列化ISO-8601字符串表示。
默认情况下,Spring将为您提供一个由ObjectMappper
创建的实例Jackson2ObjectMapperBuilder
。该实例是为您自动配置的。有关详细信息,请参见类文档。
如果要ObjectMapper
完全替换默认值,请定义@Bean
该类型的a并将其标记为@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
。有关详细信息,请参见文档。