2015-11-01 96 views
3

0123ctSecton 65.3表明我可以通过提供我自己的替换默认的ObjectMapper。我没有使用引导,只是一个构建到.war并在tomcat中运行的Spring WebMVC应用程序。弹簧4(无引导)与自定义杰克逊ObjectMapper

它实例化我的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豆。

我以上采用的方法在Spring 3中工作得很好,而不是当我修改到4.2.2时。我也读过Jackson Integration Improvements,并尝试了其中的方法,达到相同的效果。

--Chris

+0

是'JodaMapper'你的类是否扩展了ObjectMapper?你有'WebMvcConfigurerAdapter'在哪里注册一个'MappingJackson2HttpMessageConverter'? –

+0

JodaMapper确实是一个扩展ObjectMapper的类,但我没有写它 - 它是jackson-datatype-joda的一个内置部分。它是一个简短的子类,主要是调用super()然后注册新的JodaModule(),然后为它所支持的Joda类型注册串行器/解串器。 我有一个WebMvcConfigurerAdapter,我注册了一个MappingJackson2HttpMessagConverter。它似乎没有什么区别,但它应该有? Spring是否会找到ObjectMapper的机制? – wz2b

+1

你有没有解决这个问题? –

回答

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)方法。

+2

它似乎没有工作......正如@ wz2b所说,每个配置都不被Spring考虑...... – sixro

+1

对我来说也不起作用。 –

+1

您是否找到解决方案?对我来说都不起作用...... – cyberjoac

0

在Spring 4我已经解决了以下XML配置

<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

+0

我的错在于将它放在/WEB-INF/spring/root-context.xml中的上下文配置下 – marcogramy