Обеспечить согласованное поведение ObjectMapper в запросах GET / POST - PullRequest
1 голос
/ 26 сентября 2019

У меня есть метод, подобный следующему, который уже существует и работает нормально:

@PostMapping(
      value = "/store",
      consumes = "application/json")
public ResponseEntity<String> postConversionEvent(@RequestBody Event event) {
  ...
}

Теперь также необходимо, чтобы информация была опубликована с помощью метода GET, а именно:

@GetMapping("/store")
public ResponseEntity<String> postConversionEventAsGet(Event event) {
  ...
}

Для всех намерений и целей, мы можем предположить, что класс Event содержит одно поле org.joda.time.DateTime.Для поддержки этого у меня есть пользовательский ObjectMapper, который поддерживает синтаксический анализ DateTime s из строковых временных меток.например, следующий запрос будет работать нормально:

Тело POST для /store:

{
  "date": "238572349834"
}

Однако, когда я отправляю это как GET, например:

https://someUrl.com/store?date=238572349834

Я получаю следующую ошибку:

Field error in object 'event' on field 'date': rejected value [238572349834]; codes [typeMismatch.Event.date,typeMismatch.date,typeMismatch.org.joda.time.DateTime,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [Event.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'org.joda.time.DateTime' for property 'date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [org.joda.time.DateTime] for value '238572349834'; nested exception is java.lang.IllegalArgumentException: Invalid format: "238572349834" is malformed at "8572349834"]

Похоже, что этот синтаксический анализ не использует тот же ObjectMapper, что и метод POST.Есть ли способ, как я могу это исправить?

1 Ответ

0 голосов
/ 27 сентября 2019

Похоже, что запросы GET не сериализуются с использованием ObjectMapper, а вместо этого сопоставляются с использованием WebDataBinder.

Этот класс был создан:

public class DateTimeFromTimestampEditor extends PropertyEditorSupport {

  @Override
  public String getAsText() {
    return Long.toString(((DateTime) getValue()).getMillis());
  }

  @Override
  public void setAsText(String text) throws IllegalArgumentException {
    setValue(new DateTime(Long.parseLong(text), DateTimeZone.UTC));
  }

}

Я тогдадобавил этот метод к контроллеру:

@InitBinder
public void dataBinding(WebDataBinder binder) {
  binder.registerCustomEditor(DateTime.class, new DateTimeFromTimestampEditor());
}

Ранее неудачный запрос GET (https://someUrl.com/store?date=238572349834) теперь может быть успешно десериализован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...