2015-11-01 38 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