Spring MVC: десериализовать параметры запроса в POJO с помощью Jackson objectMapper

Конфигурация веб-приложения 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

person Marko Vranjkovic    schedule 16.03.2017    source источник


Ответы (1)


Внедрение objectMapper и преобразование карты параметров запроса в объект решает проблему

@Slf4j
@RestController
class MyController {

  @Autowired
  private ObjectMapper objectMapper

  @GetMapping('/pojo')
  void getPojo(@RequestParam Map<String, String> allRequestParams) {
    MyRequest request = objectMapper.convertValue(allRequestParams, MyRequest)
    log.debug("Request received: $myRequest")
  }
...
person Marko Vranjkovic    schedule 20.03.2017