Spring Boot:Jackson不会从“application.properties”中获取配置

时间:2017-09-16 01:06:38

标签: 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个实例总是写成时间戳。我检查了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。 :(

2 个答案:

答案 0 :(得分:1)

也许您可以创建自定义MappingJackson2HttpMessageConverterObjectMapper。这是一个示例配置类

@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以在应用程序上下文中使用。