Spring MVC GET-запрос с параметром Java 8 Instant request
Я пытаюсь написать контроллер Spring MVC GET, который принимает Java 8 Instant в качестве параметра запроса:
@GetMapping
@JsonView(OrderListing.class)
@Validated
public WebSeekPaginatedResultsDto<OrderListingDto> findAll(@Valid OrderSearchCommand orderSearchCommand) {
// Some code
}
с:
public class OrderSearchCommand {
private Instant dateCreatedStart;
private Instant dateCreatedEnd;
// Some other fields
}
Я запускаю запрос GET из некоторого кода React/Javascript с чем-то вроде этого:
http://localhost:8080/mms/front/orders?dateCreatedStart=2017-05-31T22%3A00%3A00.000Z
Весне, похоже, это не нравится и выдает ошибку. Вот сообщение об ошибке:
Failed to convert property value of type 'java.lang.String' to required type 'java.time.Instant' for property 'dateCreatedStart';
nested exception is java.lang.IllegalStateException:
Cannot convert value of type 'java.lang.String' to required type 'java.time.Instant' for property 'dateCreatedStart': no matching editors or conversion strategy found
Есть идеи, почему я это понимаю?
Спасибо
3 ответа
Сообщение об ошибке говорит само за себя: нет зарегистрированных String
в Instant
конвертер.
когда Controller
получает запрос, все параметры String
s. Spring/Jackson имеет список предопределенных конвертеров для большинства основных типов:
- String > Integer
- String > Boolean
Но по умолчанию нет String > Instant конвертер.
Вам необходимо создать и зарегистрировать один. Или вы можете изменить тип ввода на что-то, с чем может справиться Spring @DateTimeFormat
аннотация: Как принять параметры Date в GET-запросе к Spring MVC Controller?
Я подозреваю, что @DateTimeFormat не будет работать для Instant
поля. В частности,Instant
не указан в качестве одного из типов, для которых он работает в справочном документе Spring.
Проверьте Spring Reference Раздел 9.5 для деталей о преобразовании пользовательских типов Spring. Создать Converter<String, Instant>
конвертер. Раздел 9.5.5 посвящен регистрации пользовательских преобразователей типов.
Может быть, это может помочь вам? сериализация / десериализация java 8 java.time с помощью JSON JSON Mapper. Я вижу, что этот Jackson включает класс Instant.