Где указать настройки Jackson SerializationConfig.Feature в Spring 3.1

Я озадачен тем, почему при использовании включения Джексона по умолчанию Spring, похоже, настроил конфигурацию Джексона по умолчанию.

Один параметр, с которым он возится, — WRITE_DATES_AS_TIMESTAMPS, по умолчанию для Джексонаtrue, однако Spring где-то изменил его на false, а также предоставил формат даты.

Где в мире это происходит? Я хочу, чтобы мои даты оставались сериализованными как числа.

ОБНОВЛЕНИЕ: оказалось, что проблема не в spring, а в гибернации прокси-классов, вызывающих проблему. По какой-то причине, если hibernate имеет сопоставление типов type="date", он сериализуется как строка даты, хотя, если его type="timestamp", он сериализуется, как и ожидалось. Вместо того, чтобы тратить слишком много времени на изучение этого, я решил просто изменить все свои сопоставления на отметку времени.


person Brett Ryan    schedule 06.03.2012    source источник


Ответы (1)


Начиная с 3.1 M1, вы можете указать пользовательскую конфигурацию Джексона, зарегистрировав HttpMessageConverters через подэлемент mvc:annotation-driven.

См. Spring 3.1 MVC. Усовершенствования пространства имен

См. SPR- 7504 Упростите добавление новых преобразователей сообщений в AnnotationMethodHandlerAdapter.

Пример:

<bean id="jacksonObjectMapper" class="x.y.z.CustomObjectMapper">                
</bean>

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

Объект CustomObjectMapper

    @Component("jacksonObjectMapper")
    public class CustomObjectMapper extends ObjectMapper {

        @PostConstruct
        public void afterPropertiesSet() throws Exception {

            SerializationConfig serialConfig = getSerializationConfig()     
                        .withDateFormat(null);

                  //any other configuration

            this.setSerializationConfig(serialConfig);
        }
    }

SerializationConfig .withDateFormat

В дополнение к созданию экземпляра с указанным форматом даты, будет включать или отключать Feature.WRITE_DATES_AS_TIMESTAMPS (включить, если формат установлен как нулевой; отключить, если не нулевой)

person Joel Hudon    schedule 14.03.2012
comment
Похоже, это именно то, что мне нужно, хотя либо это не работает для меня, либо по какой-то другой причине Spring выбирает экземпляр MappingJacksonHttpMessageConverter, отличный от того, который я создал. Есть ли способ идентифицировать все созданные экземпляры MappingJacksonHttpMessageConverter, которые могут быть выбраны? - person Brett Ryan; 15.03.2012
comment
Я подтвердил, что реализация CustomObjectMapper записывает правильный формат, просто записывая тестовый объект в файл после this.setSerializationConfig(serialConfig);, и он работает нормально, хотя этот экземпляр, похоже, не используется объявлением <mvc:annotation-driven>. Возможно, мне нужно указать id для известного типа? - person Brett Ryan; 15.03.2012
comment
Я нашел свою проблему. Это сводится к использованию спящего режима отображения type="date", переход на type="timestamp" решил проблему. - person Brett Ryan; 15.03.2012