Настройте, как Джексон выполняет разбор LocalDate

Sonackson является наиболее широко используемой библиотекой синтаксического анализатора / генератора ĴSON в экосистеме Java и является зависимостью по умолчанию от Spring Boot .

Даты бывают разных форматов, и это проблема, когда мы хотим перейти от поля даты в JSON к объекту Java Localdate .

Девушка на доске

Что это значит?

Например, в GearBuddy , моем приложении для управления снаряжением на открытом воздухе, вы можете отслеживать, когда вы приобрели каждый предмет снаряжения с помощью поля purchaseDate. Это дата без времени, и идея заключается в том, что вы поставили ее 24 мая 1995 года или когда вы ее купили.

JSON не имеет типа «дата», поэтому вы можете передать строку для даты в запросе. В GearBuddy запрос выглядит следующим образом (обратите внимание на последнее поле):

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

Домашняя ссора.  От Барбера, Джона В. Справочник иллюстрированных пословиц (Нью-Йорк, Нью-Йорк: Джордж Ф. Таттл, 1857)

Почему это не сработает

Сообщение об ошибке не может полностью объяснить, почему приложение злится, но это потому, что переданная строка даты («21 октября 2016 года») не в том формате, который Джексон может проанализировать. Для некоторых людей это может быть странно, потому что «21.10.2016» - это распространенный способ написания дат в Соединенных Штатах.

Но Джексон знает только международный формат yyyy-MM-dd по умолчанию, что означает, что если мы изменим запрос на «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 и аннотацию JsonFormat:

// ...
@JsonProperty("purchaseDate") @JsonFormat(pattern = "MM/dd/yyyy") LocalDate purchaseDate,
// ...

Вы можете прочитать больше о документации@JsonFormat по Jackson API .

После внесения этого изменения и компиляции приложения запросы с форматом даты «21.10.2016» теперь могут выполняться успешно!

Примечание: Первоначально опубликовано на code.scottshipp.com .

от: https://dev.to//scottshipp/customize-how-jackson-does-localdate-parsing-2hc5

Опубликовано 0 оригинальных статей · понравилось 0 · посещения 659

рекомендация

отblog.csdn.net/cunxiedian8614/article/details/105691025