2017-10-27 78 views
1
  • 자바 직렬화 fasterxml.jackson 1.8
  • 봄 부팅 1.5.8
  • faster.xml.jackson (jackson-module-parameter-names, jackson-datatype-jdk8, jackson-datatype-jsr310) 2.9.2

나는 개체가 타임 스탬프.자바 LocalDateTime wrongTokenException

@JsonProperty("timestamp") 
private LocalDateTime timestamp; 

내가 역 직렬화해야 할 LocalDateTime 스탬프는 다음과 같습니다

{ "year":2017, "month":"OCTOBER", "dayOfMonth":27, "dayOfWeek":"FRIDAY", "dayOfYear":300, "monthValue":10, "nano":460000000, "hour":4, "minute":47, "second":29, "chronology":{
"calendarType":"iso8601", "id":"ISO" } }

내가 가진 개체를 역 직렬화 할 :

MyObject myObject= 
     new ObjectMapper() 
      .findAndRegisterModules() 
      .treeToValue(jsonPayload, MyObject.class); 

응용 프로그램이 호출에서 얼어 내가 방해하는 경우 다음과 같은 오류 메시지가 나타납니다.

,210
Error while stopping the container: 
java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.DeserializationContext.wrongTokenException(Lcom/fasterxml/jackson/core/JsonParser;Ljava/lang/Class;Lcom/fasterxml/jackson/core/JsonToken;Ljava/lang/String;)Lcom/fasterxml/jackson/databind/JsonMappingException; 
     at com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer.deserialize(LocalDateTimeDeserializer.java:138) ~[jackson-datatype-jsr310-2.9.2.jar!/:2.9.2] 
     at com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer.deserialize(LocalDateTimeDeserializer.java:39) ~[jackson-datatype-jsr310-2.9.2.jar!/:2.9.2] 
     at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:504) ~[jackson-databind-2.8.10.jar!/:2.8.10] 
     at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:111) ~[jackson-databind-2.8.10.jar!/:2.8.10] 
     at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:276) ~[jackson-databind-2.8.10.jar!/:2.8.10] 
     at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140) ~[jackson-databind-2.8.10.jar!/:2.8.10] 
     at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:3786) ~[jackson-databind-2.8.10.jar!/:2.8.10] 
     at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2115) ~[jackson-databind-2.8.10.jar!/:2.8.10] 
     at com.fasterxml.jackson.databind.ObjectMapper.treeToValue(ObjectMapper.java:2612) ~[jackson-databind-2.8.10.jar!/:2.8.10] 

UPDATE 'S :

전체 JSON은 다음과 같습니다

{"valid":true,"version":"0.0.1", 
"timestamp":{"year":2017,"month":"OCTOBER","dayOfMonth":27,"dayOfWeek":"FRIDAY","dayOfYear":300,"monthValue":10,"nano":460000000,"hour":4,"minute":47,"second":29,"chronology":{"calendarType":"iso8601","id":"ISO"}}, 
"tenant":"stackoverflow","uid":"10fa132f-2c92-4fa5-bcc2-ee6023281503"}) 

직렬화로 :

String jsonString = new ObjectMapper().writeValueAsString(messageIndex); 

개체 속성 :

@JsonProperty("version") 
private String version; 

@JsonProperty("timestamp") 
private LocalDateTime timestamp; 

@JsonProperty("tenant") 
private String tenant; 

@JsonProperty("dataSampleUid") 
private UUID uid; 

private boolean isValid; 
LocalDateTime.now() 
+0

treeToValue를 사용해야하는 이유는 무엇입니까? 왜 jsonMapper.readValue (객체, 클래스)를 사용하지 않습니까? – mrkernelpanic

+0

JsonNode를 사용하면 스키마의 유효성을 검사 할 수 있습니다. readValue를 사용해 보았습니다. 변경하지 않았습니다. 문제는 디시리얼라이저가 LocalDateTime에 문제가 있다는 것인데, Error 스 니펫의 행 3과 4를 참조하십시오. –

+0

그냥 궁금해서 잭슨 종속성, 특히 jackson-datatype-jsr310을 2.9.2 버전에서 이전 버전으로 되돌릴 수 있습니까? 2.8.10? – mrkernelpanic

답변

2

당신이 특히 JavaTimeModule 따라서 다른 모든 객체처럼 직렬화되는 LocalDateTime가는 모든 모듈을 등록하지 않았습니다 직렬화 (모든 접근 필드를 인쇄) : 414,LocalDateTime이 설정됩니다. 그러나 deserialization 부분에서이 모듈을 등록했으며 LocalDateTime (by default an array)의 특정 형식을 기대합니다.

이 그냥 직렬화 부분 업데이트 작업 할 경우

String jsonString = new ObjectMapper().findAndRegisterModules().writeValueAsString(messageIndex); 

당신은 같은 응용 프로그램을 통해 동일한 개체 매퍼를 재사용해야을 독자 마찬가지입니다. 스레드 안전성과 인스턴스가 비교적 가벼우므로 둘 다.

이것을 실행하면 제대로 작동하고있는 것을 볼 수 있으며 LocalDateTime 일련 값의 차이가 표시됩니다.

ObjectMapper mapper = new ObjectMapper().findAndRegisterModules(); 
MyObject data = new MyObject(); 
data.setTimestamp(LocalDateTime.now()); 
String result = mapper.writeValueAsString(data); 
System.out.println(result); 
JsonNode tree = mapper.reader().readTree(result); 
mapper.treeToValue(tree, MyObject.class); 
+0

변경하지 마십시오 –

+0

빠른 샘플을 추가하여 실행했습니다. – JEY

+0

네 말이 맞아, 나는 빌드하기 전에 완전하게 정리했고, 이제는 모든 것이 작동한다! 고맙습니다. –