Java 春靴:杰克逊赢得';t从";应用程序.属性“;
我有一个基于多模块Maven的Spring Boot应用程序。在我的一个模块的Java 春靴:杰克逊赢得';t从";应用程序.属性“;,java,json,spring-boot,serialization,jackson,Java,Json,Spring Boot,Serialization,Jackson,我有一个基于多模块Maven的Spring Boot应用程序。在我的一个模块的application.properties文件中,我将Jackson设置为而不是将日期序列化为时间戳(数组),以便它们始终序列化为字符串(这是回退行为)。财产是这样的: spring.jackson.serialization.write_dates_as_timestamps=false 问题是。。。Spring Boot/Jackson似乎都没有捡到该财产。我试图序列化的java.time.LocalDate实
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:(也许您可以创建一个自定义的映射Jackson2HttpMessageConverter
和一个对象映射器
@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;
}
}
多亏了因陀罗的回答,我得到了一条重要的线索,帮助我解决了这个问题
事实证明,我的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);
}
}
我所做的是显式地配置需要配置的restemplate
实例
以下文档也非常有用:。它描述了如何声明自定义HttpMessageConverters以在应用程序上下文中使用。是否有必要扩展WebMVCConfigureAdapter?我通常按照上面示例中的方式进行操作。更多地控制ObjectMapper
的行为。创建自定义HttppMessageConverter
让我意识到我必须将它显式地注入到我试图配置的restemplate
实例中。我添加了一个答案,详细说明了我的发现: