О дате весеннего отдыха

#spring #spring-boot #hibernate #timezone #spring-rest

#весна #весенняя загрузка #спящий режим #Часовой пояс #весенний отдых

Вопрос:

Я использую весеннюю загрузку, спящий режим.У меня также есть класс для значений времени, унаследованных от класса DATE.Я использую этот унаследованный класс в своих сущностях.

Значение столбца в базе данных равно ’08 / 01/2020 18:02:22 ‘. Когда я получаю это значение с помощью postman, оно отображается как «2020-01-08T15: 02: 22.000 0000» на клиенте rest. Когда ‘2020-01-08T15: 02: 22.000 0000’ отправляется с rest-клиента, значение столбца отображается как ’08 / 01/2020 18:02:22 ‘.( правильное значение)

значение должно отображаться как «дд / ММ / гггг ЧЧ: мм: сс» везде. Как я могу это сделать?

метод конструктора в унаследованном классе date:

 this.setTime(new SimpleDateFormat(SPRING_DATE_FORMAT_PATTERN).parse(str).getTime())
  

Комментарии:

1. Почему это должно быть? Это просто toString данные. Почему дата должна быть внезапно отформатирована, потому что она была проанализирована с определенным форматом?

Ответ №1:

То, что вы ищете, — это способ изменить значение метки времени, когда оно сериализуется из объекта Java в JSON или XML.

Библиотека, ответственная за это, — Jackson, а объект, фактически выполняющий это, называется ObjectMapper . По умолчанию она будет сериализована в нотации ISO-8601. Если вы хотите изменить способ вывода, вы можете либо сразу перейти к кодированию, определяющему Jackson2ObjectMapperBuilderCustomizer компонент (см. Ниже), либо, если вы используете Spring Boot, вы можете добавить в свою application.properties следующую запись;

 spring.jackson.date-format=dd/MM/yyyy HH:mm:ss
  

Однако есть один недостаток, который заключается в том, что он не поддерживает классы даты и времени Java8. Таким образом, это не повлияет на то, как он сериализует java.time.LocalDate или java.time.Localtime , или комбинирует java.time.LocalDateTime объекты. Это работает только для java.util.Date or java.util.Calendar .

Если вам нужна поддержка Java8, тогда ваш единственный вариант — испачкать руки вот так

 @Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
    final String dateFormat = "yyyy-MM-dd";
    final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";

    return builder -> {
        builder.simpleDateFormat(dateTimeFormat);
        builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));
        builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));
    };
}
  

В заключение я отмечу, что если вы хотите изменить вывод только определенных полей, а не всех, вы можете аннотировать определенные поля в вашем DTO с @com.fasterxml.jackson.annotation.JsonFormat помощью аннотации Джексона.