Конфигурация веб-приложения Spring содержит Джексона ObjectMapper
, настроенного следующим образом
objectMapper.disable(ADJUST_DATES_TO_CONTEXT_TIME_ZONE)
objectMapper.registerModule(new JavaTimeModule())
JavaTimeModule
добавлен для обработки десериализации ZonedDateTime
. Есть две конечные точки, которые обрабатывают POJO, содержащий ZonedDateTime
. POJO выглядит так:
class MyRequest {
ZonedDateTime from
ZonedDateTime to
}
и контроллер с конечными точками:
@Slf4j
@RestController
class MyController {
@GetMapping('/pojo')
void getPojo(MyRequest myRequest) {
log.debug("Request received: $myRequest")
}
@PostMapping('/pojo')
void postPojo(@RequestBody MyRequest myRequest) {
log.debug("Request received: $myRequest")
}
}
Когда я отправляю POST /pojo с телом
{"from": "2017-03-15T00:00:00Z", "to": "2017-03-16T00:00:00Z"}
Ответ равен 200, и десериализация прошла успешно.
Наоборот, когда я отправляю
GET /pojo?from=2017-03-15T00:00:00Z&to=2017-03-15T00:00:00Z
400 Bad Request получен с ошибкой
Failed to convert from type [java.lang.String] to type [java.time.ZonedDateTime] for value '2017-03-15T00:00:00Z'
Это имеет смысл, поскольку в запросе GET я не отправляю JSON, и поэтому средство отображения объектов JSON не вызывается.
Есть ли способ использовать objectMapper
также для запросов GET, чтобы параметры запроса преобразовывались в объект POJO?
Кстати, я знаю, что его можно десериализовать для конечной точки GET, как показано ниже, но я хочу использовать один и тот же преобразователь для конечных точек GET и POST.
@DateTimeFormat(iso = ISO.DATE_TIME)
ZonedDateTime from
@DateTimeFormat(iso = ISO.DATE_TIME)
ZonedDateTime to