Skip to content
Advertisement

Jackson deserialization issue for ZonedDateTime

I’ve the following field in a class I use during deserialization of a service that I’m consuming.

private ZonedDateTime transactionDateTime;

The service I’m consuming may return a Date or DateTime using the pattern: yyyy-MM-dd'T'HH:mm:ss.SSSZ

Let me give 2 examples of what the service returns:

  • 2015-11-18T18:05:38.000+0200
  • 2015-11-18T00:00:00.000+0200

While first one works well, the latter causes the following exception to be thrown during deserialization:

java.time.format.DateTimeParseException: Text ‘2015-11-18T00:00:00.000+0200’ could not be parsed at index 23

I’m using;

  • Spring Boot 1.3.1
  • Jackson 2.6.4 (with JSR310 module included)

Does this require a custom deserialization class?

Advertisement

Answer

Earlier in the code I was using the field with @JsonFormat annotation but removed that as I thought it was meant for serialization only like the JavaDocs suggest.

Turned out that I needed add back that annotation. And the real issue was that the 3rd party service response was indeed wrong (it was missing a wrapper element in the XML) which caused the deserialisation to fail. The error was:

com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class com.foo.bar.adapter.john.model.account.UserAccount] from String value (‘2015-11-18T00:00:00.000+0200’); no single-String constructor/factory method

The field is written like below:

@JsonFormat(pattern = Constants.DATETIME_FORMAT)
@JacksonXmlProperty(localName = "transactionDate")
private ZonedDateTime transactionDateTime;

Also I had to add @JsonRootName("transaction") to the class of this field because the object is wrapped into a collection.

Advertisement