복붙노트

[SPRING] Java Spring Jackson 날짜 직렬화

SPRING

Java Spring Jackson 날짜 직렬화

JSON de / serialization을 위해 Spring MVC와 Jackson을 사용하고 있습니다. 하지만 인스턴트 메시지에 문제가있다.

기본적으로 Jackson은 날짜를 에포크로 직렬화합니다. 하지만 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>

해결법

  1. ==============================

    1.Spring 3.1에서이 작업을 수행하는 훨씬 간단한 방법.

    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"/>
    
  2. ==============================

    2.나에게 적합한 Spring 3.1.3 및 Jackson 2.1.0을 사용하는 솔루션 (Java 코드 "SerializationConfig.Feature"-> "SerializationFeature"의 추가 변경 사항이있는 Ryans 응답 및 Kornys 노트를 기반으로 함)

    나에게 적합한 Spring 3.1.3 및 Jackson 2.1.0을 사용하는 솔루션 (Java 코드 "SerializationConfig.Feature"-> "SerializationFeature"의 추가 변경 사항이있는 Ryans 응답 및 Kornys 노트를 기반으로 함)

    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"/>
    
  3. ==============================

    3.스프링 플랫폼 2.0 (스프링 4.2)과 잭슨 2.6.3

    스프링 플랫폼 2.0 (스프링 4.2)과 잭슨 2.6.3

    Pom.hml

    <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>
    
  4. ==============================

    4.내 문제를 해결했습니다. 그래서 비슷한 문제를 가진 다른 사람들을 참조하십시오.

    내 문제를 해결했습니다. 그래서 비슷한 문제를 가진 다른 사람들을 참조하십시오.

    Spring 컨텍스트 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>
    

    이 봄 이후로 나는 ISO 날짜로 json으로 나의 날짜를 직렬화 할 수 있었다.

  5. from https://stackoverflow.com/questions/7672211/java-spring-jackons-date-serialization by cc-by-sa and MIT license