Java 春靴:杰克逊赢得';t从";应用程序.属性“;

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实

我有一个基于多模块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:(

也许您可以创建一个自定义的
映射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
实例中。我添加了一个答案,详细说明了我的发现: