[SPRING] jackson2 봄 3.2RC1에서 JodaTime의 JSON ISO 8601 날짜
SPRINGjackson2 봄 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.또는 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.결국 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.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.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.필자는 같은 문제로 어려움을 겪었으며 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을 찾을 수 있습니다.
from https://stackoverflow.com/questions/13700853/jackson2-json-iso-8601-date-from-jodatime-in-spring-3-2rc1 by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] application.properties에서 정적 변수에 값을 할당하는 방법은 무엇입니까? (0) | 2019.01.13 |
---|---|
[SPRING] 동일한 지속성 단위로 여러 Db를 읽는 중입니까? (0) | 2019.01.13 |
[SPRING] spring mvc에는 브라우저에 직접 출력 할 response.write가 있습니까? (0) | 2019.01.13 |
[SPRING] Spring 보안 이동 Java Config에는 authentication-success-handler-ref는 어디로 이동합니까? (0) | 2019.01.13 |
[SPRING] Spring 데이터 Rest : RepositoryEventHandler 메소드가 호출되지 않았습니다. (0) | 2019.01.13 |