Java Spring Jackons Дата сериализации - PullRequest
6 голосов
/ 06 октября 2011

Я использую Spring MVC и Джексона для де-сериализации JSON.Но у меня проблема с сериализацией даты.

По умолчанию Джексон сериализует дату как эпоху.Но я хочу сериализовать его как дату ISO (т.е. 06-10-2011 11:00:00).

Код ниже - это мой весенний конфиг, но он не работает.Это все еще возвращает дату эпохи.

Итак, мой вопрос, как я могу сериализоваться на не эпоху?

<!-- JSON -->
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    <property name="supportedMediaTypes" value="application/json" />
    <property name="objectMapper" ref="jacksonObjectMapper" />
</bean>

<bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" />

<bean id="jacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig" factory-bean="jacksonObjectMapper" factory-method="getSerializationConfig" />

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject" ref="jacksonSerializationConfig" />
    <property name="targetMethod" value="setSerializationInclusion" />
    <property name="arguments">
        <list>
            <value type="org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion">NON_NULL</value>
        </list>
    </property>
</bean>

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject" ref="jacksonSerializationConfig" />
    <property name="targetMethod" value="setDateFormat" />
    <property name="arguments">
        <list>
            <value type="java.text.SimpleDateFormat">yyyy-MM-dd'T'HH:mm:ss.SSSZ</value>
        </list>
    </property>
</bean>

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject" ref="jacksonSerializationConfig" />
    <property name="targetMethod" value="enable" />
    <property name="arguments">
        <list>
            <value type="org.codehaus.jackson.map.SerializationConfig.Feature">WRITE_DATES_AS_TIMESTAMPS</value>
        </list>
    </property>
</bean>

Ответы [ 4 ]

17 голосов
/ 24 января 2013

Гораздо более простой способ сделать это сейчас в Spring 3.1.

public class CustomObjectMapper extends ObjectMapper {

    public CustomObjectMapper() {
        configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);            
        setDateFormat(new ISO8601DateFormat());
    }
}

А затем зарегистрировать это как bean-компонент и настроить элемент mvc: annotation-driven.

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

<bean id="customObjectMapper" class="CustomObjectMapper"/>
5 голосов
/ 03 декабря 2015

Я обнаружил следующее для работы с Spring Platform 2.0 (Spring 4.2) и Jackson 2.6.3

pom.xml

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
</dependency>

<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-joda</artifactId>
</dependency>

applicationContext.xml

<mvc:annotation-driven>
  <mvc:message-converters>
     <beans:bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
       <beans:property name="objectMapper">
         <beans:bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
         <beans:property name="featuresToDisable">
           <beans:array>
             <util:constant static-field="com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS"/>
           </beans:array>
         </beans:property>               
         </beans:bean>
       </beans:property>
     </beans:bean>
   </mvc:message-converters>        
</mvc:annotation-driven>
5 голосов
/ 23 мая 2013

Решение с использованием Spring 3.1.3 и Jackson 2.1.0, которое работает для меня (на основе ответа Райана и заметок Корниса с дополнительными изменениями в коде Java "SerializationConfig.Feature" -> "SerializationFeature")

public class DateObjectMapper extends ObjectMapper {

public DateObjectMapper() {
    configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);            
}

Конфигурация:

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

<bean id="dateObjectMapper" class="DateObjectMapper"/>
1 голос
/ 10 октября 2011

Я исправил свою проблему.Так что для ссылки на других с подобной проблемой.

Я удалил следующие элементы в весеннем контексте config xml:

<mvc:annotation-driven/>

и

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="jacksonSerializationConfig" />
<property name="targetMethod" value="setDateFormat" />
<property name="arguments">
    <list>
        <value type="java.text.SimpleDateFormat">yyyy-MM-dd'T'HH:mm:ss.SSSZ</value>
    </list>
</property>

Затем я добавил следующее:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="order" value="1" />
</bean>

и изменил следующее:

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="jacksonSerializationConfig" />
<property name="targetMethod" value="enable" />
<property name="arguments">
    <list>
        <value type="org.codehaus.jackson.map.SerializationConfig.Feature">WRITE_DATES_AS_TIMESTAMPS</value>
    </list>
</property>

в

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="jacksonSerializationConfig" />
<property name="targetMethod" value="disable" />
<property name="arguments">
    <list>
        <value type="org.codehaus.jackson.map.SerializationConfig.Feature">WRITE_DATES_AS_TIMESTAMPS</value>
    </list>
</property>

После этого Spring смог сериализовать мою дату в json как дату ISO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...