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

时间:2015-11-01 23:45:04

标签: spring jackson jodatime

spring boot manual的第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,并尝试了那里列出的方法,效果相同。

- 克里斯

2 个答案:

答案 0 :(得分:2)

我一直这样做的方式是:

@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:

的一个警告
  

请注意,将转换器添加到列表中会关闭默认转换器注册。要简单地添加转换器而不影响默认注册,请考虑使用extendMessageConverters(java.util.List)方法。

答案 1 :(得分:0)

在Spring 4中,我使用以下xml-configuration

解决了这个问题
<bean name="jacksonObjectMapper"
    class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
    <property name="featuresToDisable">
    <array>
        <util:constant
            static-field="com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS" />
    </array>
    </property>
</bean>

<mvc:annotation-driven>
    <mvc:message-converters register-defaults="true">
    <bean
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="objectMapper" ref="jacksonObjectMapper" />
    </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

将它放在Servlet配置文件中,通常在

  

/ WEB-INF /弹簧/ appServlet / *。xml的