#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
помощью аннотации Джексона.