使用自定义jackson ObjectMapper的Spring 4(无启动)

spring boot manual的Secton 65.3表明我可以通过提供自己的ObjectMapper来替换它.我没有使用boot,只是一个构建为.war并在tomcat中运行的Spring WebMVC应用程序.

它实例化我的ObjectMapper但不使用它.我使用调试器来跟踪为什么时间戳仍然以数字形式出现,并发现它使用了不同的ObjectMapper实例.我不清楚它来自哪里,或者为什么这不会导致它只使用我的:

    @Primary
@Bean
public ObjectMapper localObjectMapper() {
    JodaMapper mapper = new JodaMapper();
    mapper.setWriteDatesAsTimestamps(false);
    mapper.getSerializationConfig().with(SerializationFeature.INDENT_OUTPUT)
            .without(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS)
            .without(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS)
            .without(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

    return mapper;
}

以上是在@Configure bean中,肯定会被加载.

我在上面采用的方法在Spring 3中运行良好,而不是在我将其改为4.2.2时.我也阅读了Jackson Integration Improvements,并尝试了那里列出的方法,达到同样的效果.

– 克里斯

最佳答案 我一直这样做的方式是:

@Configuration
@EnableWebMvc
public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {

    @Bean
    public ObjectMapper localObjectMapper() {
        JodaMapper mapper = new JodaMapper();
        // ...
        return mapper;
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new MappingJackson2HttpMessageConverter (localObjectMapper())); // use your own ObjectMapper
    }
}

一个警告,引用WebMvcConfigurer.html#configureMessageConverters的JavaDoc:

Note that adding converters to the list, turns off default converter registration. To simply add a converter without impacting default registration, consider using the method extendMessageConverters(java.util.List) instead.

点赞