Jackson является наиболее широко используемой библиотекой JSON синтаксического анализатора/генератора в экосистеме Java и является зависимостью по умолчанию от Spring Boot .
Даты бывают разных форматов, и это проблема, когда мы хотим перейти от поля даты в JSON к Java Локальная дата объект.
Что это значит?
Например, в Gear Приятель ,
JSON не имеет типа “данные”, поэтому вы передаете строку для даты в запросе. В Gear Buddy запрос выглядит так (обратите внимание на последнее поле):
{ "type": "Tent", "model": "Montana", "brand": "Coleman", "size": "8-person", "purchaseDate": "10/21/2016" }
Единственная проблема заключается в том, что если вы отправите этот запрос в приложение, это приведет к следующей ошибке:
{ "timestamp": "2019-06-07T21:19:47.500+0000", "status": 400, "error": "Bad Request", "message": "JSON parse error: Cannot deserialize value of type `java.time.LocalDate` from String \"10/21/2016\": Failed to deserialize java.time.LocalDate: (java.time.format.DateTimeParseException) Text '10/21/2016' could not be parsed at index 0; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDate` from String \"10/21/2016\": Failed to deserialize java.time.LocalDate: (java.time.format.DateTimeParseException) Text '10/21/2016' could not be parsed at index 0\n at [Source: (PushbackInputStream); line: 6, column: 18] (through reference chain: org.gearbuddy.requests.PostGearRequestBody[\"purchaseDate\"])", "path": "/gear" }
Почему это не сработает
Причина, по которой приложение злится, не совсем ясна из сообщения об ошибке, но это потому, что переданная строка даты (“21.10.2016”) не в формате, который Джексон может проанализировать. Возможно, некоторым из вас это покажется странным, потому что “21.10.2016” – распространенный способ написания даты в Соединенных Штатах.
Но Джексон по умолчанию понимает только международный формат гггг-ММ-дд, что означает, что если мы изменим наш запрос на “2016-10-21”, то запрос будет работать нормально.
Что может оказаться бесполезным для пользователей вашего приложения.
Так что измени это
Вы можете (конечно!) измените формат, понятный Джексону.
Способ сделать это – добавить аннотацию @JsonFormat к соответствующему полю в вашем объекте Java.
@JsonCreator(mode = JsonCreator.Mode.PROPERTIES) public PostGearRequestBody( @JsonProperty("type") String type, @JsonProperty("brand") String brand, @JsonProperty("model") String model, @JsonProperty("color") String color, @JsonProperty("size") String size, @JsonProperty("purchasePlace") String purchasePlace, @JsonProperty("purchasePrice") String purchasePrice, @JsonProperty("purchaseDate") @JsonFormat(pattern = "MM/dd/yyyy") LocalDate purchaseDate, @JsonProperty("warranty") String warranty) { // ... etc }
Обратите внимание, что предпоследний параметр метода имеет как аннотацию @JsonProperty
, так и формат Json
аннотация:
// ... @JsonProperty("purchaseDate") @JsonFormat(pattern = "MM/dd/yyyy") LocalDate purchaseDate, // ...
Вы можете прочитать больше о @JsonFormat
в документации по API Джексона .
С учетом этого изменения и компиляции приложения запрос с датой в формате “21.10.2016” теперь успешно работает!
Примечание: Первоначально опубликовано на Примечание: Первоначально опубликовано на .
Оригинал: “https://dev.to/scottshipp/customize-how-jackson-does-localdate-parsing-2hc5”