2017-10-27 2 views
1
  • Java 1.8
  • Frühlings-Boot 1.5.8
  • faster.xml.jackson (jackson-module-parameter-names, jackson-datatype-jdk8, jackson-datatype-jsr310) 2.9.2

Ich habe ein Objekt mit einem Zeitstempel.Java fasterxml.jackson deserialisieren Local wrongTokenException

@JsonProperty("timestamp") 
private LocalDateTime timestamp; 

Der LocalDateTime Stempel ich deserialisieren brauchen, ist:

{ "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" } }

Ich versuche, mit dem Objekt deserialisieren:

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

Die Anwendung bei diesem Aufruf gefriert und wenn ich unterbrechen Beim Aufruf erhalte ich folgende Fehlermeldung:

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:

Die ganze JSON ist:

{"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"}) 

Serialized mit:

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

Objektattribute:

@JsonProperty("version") 
private String version; 

@JsonProperty("timestamp") 
private LocalDateTime timestamp; 

@JsonProperty("tenant") 
private String tenant; 

@JsonProperty("dataSampleUid") 
private UUID uid; 

private boolean isValid; 

Die LocalDateTime gesetzt mit:

LocalDateTime.now() 
+0

Gibt es einen Grund, treeToValue zu verwenden? Warum benutzen Sie nicht jsonMapper.readValue (Objekt, Klasse)? – mrkernelpanic

+0

Mit einem JsonNode können Sie das Schema validieren. Ich habe es mit readValue versucht, keine Änderung. Das Problem ist, dass der Deserializer Probleme mit der LocalDateTime hat, siehe Zeile 3 und 4 des Error Snippets. –

+0

Ich bin nur neugierig, können Sie Ihre Jackson Abhängigkeiten, vor allem die jackson-datentype-jsr310 von Version 2.9.2 auf eine frühere Version, z. 2.8.10? – mrkernelpanic

Antwort

2

Wenn die Serialisierung Sie kein Modul registriert haben vor allem die JavaTimeModule deshalb Local werden wie jedes andere Objekt serialisiert werden (Druck alle ihre zugänglichen Felder). Im Deserialisierungsteil haben Sie dieses Modul registriert und erwarten ein bestimmtes Format für LocalDateTime (by default an array).

Wenn Sie dies wollen nur arbeiten, um die Serialisierung Teil zu aktualisieren:

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

Sie sollten das gleiche Objekt Mapper durch Ihre Anwendung wiederverwenden gleiche gilt für Leser. Sowohl wegen der Fadensicherheit als auch weil die Fälle relativ gering sind.

Führen Sie dies aus, und Sie werden sehen, dass es ordnungsgemäß funktioniert, und Sie werden die Unterschiede im serialisierten LocalDateTime-Wert sehen.

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

Keine Änderung –

+0

Ich habe eine schnelle Probe hinzugefügt, die Sie sehen werden. – JEY

+0

Du hast recht, ich habe vor dem Build komplette Aufräumarbeiten gemacht und jetzt funktioniert alles! Danke vielmals! –

Verwandte Themen