我有一个基于Maven的多模块Spring Boot应用程序。在我的一个模块'application.properties
文件中,我将Jackson设置为不将日期序列化为时间戳(数组),以便它们始终被序列化为字符串(这是后备行为)。该属性是这样的:
spring.jackson.serialization.write_dates_as_timestamps=false
问题是...... Spring Boot / Jackson似乎没有接受该属性。我尝试序列化的java.time.LocalDate
个实例总是写成时间戳。我检查了LocalDateSerializer.serialize(...)
方法中的代码(来自Jackson自己的JavaTimeModule),发现了这个:
@Override
public void serialize(LocalDate date, JsonGenerator generator, SerializerProvider provider) throws IOException
{
if (useTimestamp(provider)) { // This always returns true
generator.writeStartArray();
generator.writeNumber(date.getYear());
generator.writeNumber(date.getMonthValue());
generator.writeNumber(date.getDayOfMonth());
generator.writeEndArray();
} else {
String str = (_formatter == null) ? date.toString() : date.format(_formatter);
generator.writeString(str);
}
}
无论我的配置是什么,useTimestamp()
方法总是返回true。 :(
答案 0 :(得分:1)
也许您可以创建自定义MappingJackson2HttpMessageConverter
和ObjectMapper
。这是一个示例配置类
@Configuration
public class MyConfiguration extends WebMvcConfigurerAdapter {
@Bean
public MappingJackson2HttpMessageConverter
getMappingJacksonHttpMessageConverter() {
MappingJackson2HttpMessageConverter converter =
new MappingJackson2HttpMessageConverter();
...
ObjectMapper mapper = new ObjectMapper();
...
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
//or
// mapper.configure(
// SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
converter.setObjectMapper(mapper);
return converter;
}
}
答案 1 :(得分:1)
感谢英德拉的回答,我得到了一条重要的线索,帮助我找出了问题。
事实证明,我的Spring Boot应用程序在其应用程序上下文中有多个RestTemplate
实例(它是一个非常大的系统,依赖于某些自定义专有框架来工作)。这些RestTemplate
实例中的大多数只是为了支持我的系统架构。我应该关注的只有一个 RestTemplate
个实例:我写的并允许我的业务逻辑工作(通过启用我的系统使用远程RESTful API)。
因此,当我尝试配置Jackson及其ObjectMapper
时,我并没有真正影响我的 RestTemplate
实例。在我的配置被读取时,RestTemplate
很久以前已经使用Spring Boot提供的默认设置进行了初始化。
这是我的最终配置类的外观:
@Configuration
public class RestConfiguration {
@Bean
public RestTemplate myRestTemplate(HttpMessageConverters customConverters) {
RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(customConverters.getConverters());
return restTemplate;
}
/*
* The following custom HttpMessageConverter is injected into myRestTemplate
* in order to appropriately configure the serialization/deserialization of LocalDate
* instances into/from strings.
*/
@Bean
public HttpMessageConverters customConverters() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
converter.setObjectMapper(mapper);
return new HttpMessageConverters(converter);
}
}
我正在做的是明确配置需要配置的RestTemplate
实例。
以下文档也非常有用:HttpMessageConverters。它描述了如何声明自定义HttpMessageConverters以在应用程序上下文中使用。