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.