복붙노트

[SPRING] jackson2 봄 3.2RC1에서 JodaTime의 JSON ISO 8601 날짜

SPRING

jackson2 봄 3.2RC1에서 JodaTime의 JSON ISO 8601 날짜

Spring MVC 3.2RC1에서 REST API에 대해 연구 중이다.

org.joda.time.DateTime 타임 스탬프가있는 JPA 엔티티를 가져 와서 JSON으로 JSON으로 serialize합니다.

@RequestMapping(value = "/foobar", method = RequestMethod.GET, produces = "application/json")
@ResponseBody

내가 추가 한 것만 큼 Spring의 기본 Jackson2 설정 사용하기

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

내 POM에 연결하고 Spring이 자체적으로 연결되도록합니다.

컨트롤러가 다음을 생성 중입니다.

"created":{"year":2012,"dayOfMonth":30,"dayOfWeek":5,"era":1,"dayOfYear":335,"weekOfWeekyear":48,"weekyear":2012,"monthOfYear":11,"yearOfEra":2012,"yearOfCentury":12,"centuryOfEra":20,"millisOfSecond":39,"millisOfDay":52684039,"secondOfMinute":4,"secondOfDay":52684,"minuteOfHour":38,"minuteOfDay":878,"hourOfDay":14,"millis":1354282684039,"zone":{"uncachedZone":{"cachable":true,"fixed":false,"id":"Europe/Stockholm"},"fixed":false,"id":"Europe/Stockholm"},"chronology":{"zone":{"uncachedZone":{"cachable":true,"fixed":false,"id":"Europe/Stockholm"},"fixed":false,"id":"Europe/Stockholm"}},"afterNow":false,"beforeNow":true,"equalNow":false}

하지만 2007-11-16T20 : 14 : 06.3Z와 같은 ISO8601 날짜 (또는 오프셋이 포함 된 것)를 원합니다.

내 생각 엔 ObjectMapper에 액세스하고 mapper.enable (SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)을 설정해야합니다. 하지만 사용할 때 ObjectMapper에 액세스하려면 어떻게해야합니까?

<mvc:annotation-driven />

추신 JPA / Hibernate4를 사용하여 PostgreSQL에 객체를 유지 시켜서 UserType을 사용하여 JodaTime을 지원합니다. D.S.

최신 정보

아래의 설정은 java.util.Date를 위해이를 해결하지만 JodaTime의 주사위는 여전히 사용하지 않습니다.

<annotation-driven>
    <message-converters>
        <beans:bean
            class="org.springframework.http.converter.StringHttpMessageConverter" />
        <beans:bean
            class="org.springframework.http.converter.ResourceHttpMessageConverter" />
        <beans:bean
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <beans:property name="objectMapper">
                <beans:bean
                    class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"
                    p:indentOutput="true" p:simpleDateFormat="yyyy-MM-dd'T'HH:mm:ss.SSSZ">
                </beans:bean>
            </beans:property>
        </beans:bean>
    </message-converters>
</annotation-driven>

해결법

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

    1.또는 Java로 구성하는 것을 선호하는 경우 다음과 같이 표시 될 수 있습니다.

    또는 Java로 구성하는 것을 선호하는 경우 다음과 같이 표시 될 수 있습니다.

    @Configuration
    @EnableWebMvc
    public class RestConfig extends WebMvcConfigurerAdapter {
    
        private ObjectMapper objectMapper() {
            Jackson2ObjectMapperFactoryBean bean = new Jackson2ObjectMapperFactoryBean();
            bean.setIndentOutput(true);
            bean.setSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
            bean.afterPropertiesSet();
            ObjectMapper objectMapper = bean.getObject();
            objectMapper.registerModule(new JodaModule());
            return objectMapper;
        }
    
        private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
            MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
            converter.setObjectMapper(objectMapper());
            return converter;
        }
    
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
            converters.add(mappingJackson2HttpMessageConverter());
        }
    
    }
    
  2. ==============================

    2.결국 jackson-datatype-joda를 사용하여 작업하게되었습니다.

    결국 jackson-datatype-joda를 사용하여 작업하게되었습니다.

    다른 Maven 종속성을 추가하십시오 (Jackson 버전 번호와 일치).

    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-joda</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    

    그런 다음 JodaModule (변환을 처리 함)을 Jackson의 ObjectMapper에 등록하십시오 (여기에서 Spring에서 수행되었지만 도우미 클래스를 만들 수 있음).

    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
        p:targetObject-ref="objectMapper" p:targetMethod="registerModule">
        <property name="arguments">
            <list><bean class="com.fasterxml.jackson.datatype.joda.JodaModule"/></list>
        </property>
    </bean>
    

    (ObjectMapper에 id를 부여해야이 방식으로 참조 될 수 있습니다).

    Hibernate 모듈은 또한 다음과 같이 등록된다 : https://github.com/FasterXML/jackson-module-hibernate

    질문에 표시된 것처럼 (단순한) DateFormat을 설정해야하지만 SerializationFeature를 사용하지 않도록 설정해야합니다 .WRITE_DATE_KEYS_AS_TIMESTAMPS는 아무런 차이가없는 것처럼 보입니다.

  3. ==============================

    3.Spring에서 JodaTime serialization을위한 해답을 제시하고 작업 솔루션을 게시하기 만하면 (Spring 3.2에서 테스트 됨)

    Spring에서 JodaTime serialization을위한 해답을 제시하고 작업 솔루션을 게시하기 만하면 (Spring 3.2에서 테스트 됨)

    spring-context.xml

    <bean id="objectMapper"
        class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"
        p:indentOutput="true" p:simpleDateFormat="yyyy-MM-dd'T'HH:mm:ss.SSSZ">
    </bean>
    <bean
        class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"
        p:targetObject-ref="objectMapper" p:targetMethod="registerModule">
        <property name="arguments">
            <list>
                <bean class="com.fasterxml.jackson.datatype.joda.JodaModule" />
            </list>
        </property>
    </bean>
    
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
            <bean
                class="org.springframework.http.converter.ResourceHttpMessageConverter" />
    
            <bean
                class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper" ref="objectMapper" />
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    

    Maven 의존성 (com.fasterxml.jackson- 버전은 2.1.1 임)

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${com.fasterxml.jackson-version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${com.fasterxml.jackson-version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-joda</artifactId>
        <version>${com.fasterxml.jackson-version}</version>
    </dependency>
    

    이 후 ResponseBody의 JodaTime 필드는 자동으로 JSON으로 직렬화됩니다.  "createdDate": "2013-01-18T15 : 15 : 36.365 + 02 : 00"

  4. ==============================

    4.joda DayTime이있는 엔티티 필드에서 jackson이 만든 똑같은 b @ # $ d로 어려움을 겪고있었습니다.

    joda DayTime이있는 엔티티 필드에서 jackson이 만든 똑같은 b @ # $ d로 어려움을 겪고있었습니다.

    modifiedOn": {
    
    "year": 2013,
    "dayOfWeek": 6,
    "era": 1,
    "dayOfYear": 124,
    "dayOfMonth": 4,
    "weekOfWeekyear": 18,
    "monthOfYear": 5,
    "yearOfCentury": 13,
    "centuryOfEra": 20,
    "millisOfSecond": 0,
    "millisOfDay": 81801000,
    "secondOfMinute": 21,
    "secondOfDay": 81801,
    "minuteOfHour": 43,
    "minuteOfDay": 1363,
    "weekyear": 2013,
    "yearOfEra": 2013,
    "hourOfDay": 22,
    "millis": 1367700201000,
    "zone": {
        "uncachedZone": {
            "cachable": true,
            "fixed": false,
            "id": "Europe/Belgrade"
        },
        "fixed": false,
        "id": "Europe/Belgrade"
    },
    "chronology": {
        "zone": {
            "uncachedZone": {
                "cachable": true,
                "fixed": false,
                "id": "Europe/Belgrade"
            },
            "fixed": false,
            "id": "Europe/Belgrade"
        }
    },
    "afterNow": false,
    "beforeNow": true,
    "equalNow": false
    }
    

    여기에 언급 된 바와 같이 https://github.com/FasterXML/jackson-datatype-joda Jackson 2.0에서는 매우 쉽습니다. 그러나 저와 같은 초보자에게는 작동 방식을 알아내는 것이 매우 어려웠지만, 작동하는 코드 조각을 찾았습니다.

    메이븐의 의존성 - 간단했다.

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

    FasterXML 문서의 일부 코드

    objectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JodaModule());
    

    ...하지만 그것을 구현하는 방법? 여기에 예제가 있습니다 - 새로운 클래스 :

    public class JodaObjectMapper extends ObjectMapper {
    
        public JodaObjectMapper() {
            super();
            registerModule(new JodaModule());
        }
    }
    

    마지막 단계 - spring.xml에 추가

    <mvc:annotation-driven>
     <mvc:message-converters register-defaults="true">
     <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
     <property name="objectMapper">
     <bean class="net.jvw.JodaObjectMapper"/>
     </property>
     </bean>
     </mvc:message-converters>
    </mvc:annotation-driven>
    

    자, 이제 생성 된 json을 살펴 보겠습니다.

    "modifiedOn": 1367701129075
    

    마침내 다루기 쉬운 것

    블로그 게시물 http://vanwilgenburg.wordpress.com/2013/01/14/return-usable-joda-dates-in-json-with-jackson/

    만약 누군가가 내 엔티티 클래스 나 컨트롤러의 더 많은 코드를보고 싶다면 코멘트에서 물어보십시오. 그리고이 대답에 충분한 코드를 추가 할 것입니다.

  5. ==============================

    5.필자는 같은 문제로 어려움을 겪었으며 app-servlet.xml에서 JSON에 대한 DateTime의 Spring 직렬화를 이렇게 단순화하려고했습니다.

    필자는 같은 문제로 어려움을 겪었으며 app-servlet.xml에서 JSON에 대한 DateTime의 Spring 직렬화를 이렇게 단순화하려고했습니다.

    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="no.bouvet.jsonclient.spring.JsonClientJackson2ObjectMapperFactoryBean"/>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>
    

    java-json-client 라이브러리에서 no.bouvet.jsonclient.spring.JsonClientJackson2ObjectMapperFactoryBean을 찾을 수 있습니다.

  6. from https://stackoverflow.com/questions/13700853/jackson2-json-iso-8601-date-from-jodatime-in-spring-3-2rc1 by cc-by-sa and MIT license