Как я могу десериализовать LocalDateTime в LocalDate с помощью контроллера REST, чтобы получить значение в ответе LocalDateTime, значение в DTO-LocalDate?

#java #spring #serialization #annotations #converters

Вопрос:

Я нашел много информации о преобразовании / десериализации LocalDate в LocalDateTime, но не нашел о LocalDateTime в LocalDate, в случае, когда мы используем запрос REST, где ответ содержит значение в формате LocalDateTime, а у DTO, где записано это значение, есть LocalDate.

DTO, которые заполняются из тела ответа

 @Data
@NoArgsConstructor
@AllArgsConstructor
public class ContractDto {
    @JsonFormat(pattern="yyyy-MM-dd", shape = JsonFormat.Shape.STRING)
    @JsonProperty(value = "date")
    private LocalDate date;
    @JsonFormat(pattern="yyyy-MM-dd", shape = JsonFormat.Shape.STRING)
    @JsonProperty(value = "begin_date")
    private LocalDate beginDate;
    @JsonFormat(pattern="yyyy-MM-dd", shape = JsonFormat.Shape.STRING)
    @JsonProperty(value = "end_date")
    private LocalDate endDate;
}
 

Пример того, как выглядит тело ответа (некоторые другие значения были удалены для лучшего чтения)

 {
    "result": [
        {
            "date": "2015-11-16T00:00:00 03:00",
            "begin_date": "2015-11-16T00:00:00 03:00",
            "end_date": "2025-04-30T00:00:00 03:00"
        },
    ]
}
 

Ошибка, которую я заслужил ;D

 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.RestClientException: Error while extracting response for type [ru.tfm.connector.model.dto.ResultDto<ru.tfm.transport.model.dto.connector.ContractDto>] and content type [application/json]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.time.LocalDate` from String "2015-11-16T00:00:00 03:00": Failed to deserialize java.time.LocalDate: (java.time.format.DateTimeParseException) Text '2015-11-16T00:00:00 03:00' could not be parsed, unparsed text found at index 10; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDate` from String "2015-11-16T00:00:00 03:00": Failed to deserialize java.time.LocalDate: (java.time.format.DateTimeParseException) Text '2015-11-16T00:00:00 03:00' could not be parsed, unparsed text found at index 10
 at [Source: (PushbackInputStream); line: 6, column: 12] (through reference chain: ru.tfm.connector.model.dto.ResultDto["result"]->java.util.ArrayList[0]->ru.tfm.transport.model.dto.connector.ContractDto["date"])] with root cause
java.time.format.DateTimeParseException: Text '2015-11-16T00:00:00 03:00' could not be parsed, unparsed text found at index 10
 

Что я пробовал:

  1. Аннотация @JsonParser
  2. Аннотация @DateFormat

Что я думаю попробовать:

  1. Пользовательский конвертер для Джексона?
  2. Пользовательский десериализатор?

Большое спасибо!

Ответ №1:

Попробуйте использовать эти аннотации:

 @JsonSerialize(using = LocalDateSerializer.class) 
@JsonFormat(pattern="yyyy-MM-dd")