Как принять другой формат даты на контроллере отдыха с помощью Spring Boot? - PullRequest
1 голос
/ 11 июля 2020

Я реализовал метод контроллера отдыха, который получает объект в параметре RequestBody, который представляет собой простой POJO (зависимость от другого проекта).

public class SimplePOJO {
   private Date productionDate;
   private String description;
   //getters and setters
}

The json Я получаю его вот так:

{"description":"something","productionDate":"10/03/2020"}

Когда я пытаюсь вызвать остальную службу, я получаю сообщение об ошибке:

2020-07-11 15: 23: 09.274 WARN 3008 --- [nio-8441-exe c -2] .wsmsDefaultHandlerExceptionResolver: разрешено [org.springframework.http.converter.HttpMessageNotReadableException: JSON ошибка синтаксического анализа: невозможно десериализовать значение типа java.util.Date из строки «10/03/2020 : недопустимое представление (ошибка: не удалось проанализировать значение даты «10/03/2020»: невозможно проанализировать дату «10/03/2020»: несовместимо ни с одной из стандартных форм («гггг-ММ-дд'T'HH : mm: ss.SSSX "," yyyy-MM-dd'T'HH: mm: ss.SSS "," EEE, dd MMM yyyy HH: mm: ss zzz "," yyyy-MM-dd ")); вложенное исключение com.faster xml .jackson.databind.ex c .InvalidFormatException: невозможно десериализовать значение типа java.util.Date из строки «10/03/2020»: недопустимое представление (ошибка: не удалось проанализировать дату значение '10/03/2020': невозможно проанализировать дату «10/03/2020»: несовместимо ни с одной из стандартных форм («гггг-ММ-дд'T'HH: мм: сс.SSSX», «гггг-ММ -dd'T'HH: mm: ss.SSS "," EEE, dd MMM yyyy HH: mm: ss zzz "," yyyy-MM-dd "))

К сожалению, это не так можно добавить аннотацию JsonFormat в поле productionDate в SimplePOJO. Есть ли другой способ принять дату в формате "дд / ММ / гггг" в моем сервисе?

Спасибо!

1 Ответ

0 голосов
/ 11 июля 2020

Если нет возможности использовать аннотацию JsonFormat, вы должны включить свою собственную «глобальную». У меня работает следующий код:

public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {

  @Override
  public Date deserialize(JsonParser jsonParser,
                          DeserializationContext deserializationContext)
                             throws IOException, JsonProcessingException {

    SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
    String date = jsonParser.getText();
    try {
        return format.parse(date);
    } catch (ParseException e) {
        throw new RuntimeException(e);
    }
  }
}

И включите приведенный выше в веб-конфигурацию, в этом случае я протестировал Spring boot 2, используя MVC:

@Configuration
@EnableWebMvc
public class WebConfiguration implements WebMvcConfigurer {

  ...

  @Override
  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    JavaTimeModule module = new JavaTimeModule();
    module.addDeserializer(Date.class, new CustomJsonDateDeserializer());

    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(module);

    // Add converter at the first one to use
    converters.add(0, new MappingJackson2HttpMessageConverter(mapper));
  }
}

И теперь вы можете протестировать его с помощью фиктивной конечной точки:

@PostMapping("/test")
public ResponseEntity<Boolean> test(@RequestBody SimplePOJO simplePOJO) {
    return ResponseEntity.ok(true);
}

Позаботьтесь об этом , потому что это глобальный десериализатор Date, то есть вам нужно управлять в CustomJsonDateDeserializer во всех разрешенных форматах

...