RestController - используйте @DateTimeFormat внутри десериализованного POJO - PullRequest
1 голос
/ 26 июня 2019

У меня есть тело JSON с параметрами даты, которые нужно десериализовать

После Работа с параметрами даты весной

аннотировать параметры с помощью @DateTimeFormatаннотировать и предоставить параметр шаблона форматирования:

Мы также можем использовать наши собственные шаблоны преобразования.Мы можем просто предоставить параметр шаблона в аннотации @DateTimeFormat:

@PostMapping("/date")
public void date(@RequestParam("date") 
   @DateTimeFormat(pattern = "dd.MM.yyyy") Date date) {

Я создал POJO

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RequestVO {

    @DateTimeFormat(pattern = "dd.MM.yyyy hh:mm:ss")
    Date startDate;

Моя конечная точка RestController

@PostMapping(value = "path", consumes = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody String updateDate(RequestVO requestVO) {
        logger.debug("requestVO.getStartDate()=" + requestVO.getStartDate());

Я ПОСТАВЛЯЮ данные:

{"startDate":"11.11.2019 11:11:11"}

Но моя дата начала равна нулю

  • Другие параметры работают нормально (кроме даты)

Могу ли я использовать @DateTimeFormat внутри объекта или я должен объявить все параметры как в примере?

Ответы [ 3 ]

1 голос
/ 26 июня 2019

Try @ JsonDeserialize

 @JsonDeserialize(using = DateHandler.class)
  private Date publicationDate;

DateHandler класс

class DateHandler extends StdDeserializer<Date> {

  public DateHandler() {
    this(null);
  }

  public DateHandler(Class<?> clazz) {
    super(clazz);
  }

  @Override
  public Date deserialize(JsonParser jsonparser, DeserializationContext context)
      throws IOException {
    String date = jsonparser.getText();
    try {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      return sdf.parse(date);
    } catch (Exception e) {
      return null;
    }
  }

}

Для справки Как десериализовать Date из JSON с использованием Jackson

1 голос
/ 26 июня 2019

Вы пропустили @RequestBody в контроллере, поэтому значение считается QueryParam. Добавьте, это будет работать.

@PostMapping(value = "path", consumes = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String updateDate(@RequestBody RequestVO requestVO) { // Added Request Body
        logger.debug("requestVO.getStartDate()=" + requestVO.getStartDate());
}

Еще одна вещь, которую я заметил, это формат даты "dd.MM.yyyy hh:mm:ss", я думаю, что это не правильный формат DateTimeFormatter

Допустимые форматы

"yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"

Note : Might have missed some Formats but if any do edit it will be helpful to all

UPDATE

Если вам не нужен миллисек, я думаю, @DateTimeFormat вам не поможет, используйте @JsonFormat, как предлагали другие. Но вы должны изменить формат тела запроса, например

{
 "startDate":"2019-11-11 11:11:11"
}

и изменение в классе будет

 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
 Date startDate;

Также рассмотрены форматы SimpleDateFormat (@JsonFormat используйте это окно), см. SimpleDateFormat - Patterns

0 голосов
/ 26 июня 2019

Вы можете попробовать использовать:

  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
  private Date start;

и изменить нужный формат

...