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”