Значение даты загрузки Java Spring изменилось после анализа ⇐ JAVA
Значение даты загрузки Java Spring изменилось после анализа
Я пытаюсь создать REST API с помощью Java Spring Boot и в настоящее время пишу для него тестовые примеры JUnit.
Похоже, что для объекта, содержащего экземпляр java.sql.Date, после сохранения его в базе данных и ответа возвращаемым значением save(), значение даты уже не то же самое.
После двойной проверки я действительно везде использую java.sql.Date, а не java.util.Date.
Я использую PostgreSQL и Hibernate для управления базами данных.
Вот проблемный код:
Бронирование созданоBooking = новое бронирование( новая дата(System.currentTimeMillis()), ..., // остальные аргументы для обсуждения не важны ); ResponseEntity ответ = client.postForEntity( "/createBooking", BookingDto.toDTO(createBooking), BookingDto.class); AssertEquals(HttpStatus.CREATED, response.getStatusCode()); AssertNotNull(response.getBody()); AssertEquals(createdBooking.getCheckInDate(), response.getBody().getCheckInDate()); Вот реализация контроллера:
@PostMapping(value = { "/createBooking", "/createBooking/" }) @ResponseStatus(HttpStatus.CREATED) public BookingDto createBooking(@RequestBody BookingDto bookingDto) { Бронирование бронирования = bookingService.createBooking(bookingDto); return BookingDto.toDTO(бронирование); } Вот упрощенная реализация сервиса:
public Booking createBooking(BookingDto bookingDto) { Бронирование бронирования = новое бронирование(); booking.setCheckInDate(bookingDto.getCheckInDate()); // остальные аргументы не важны для обсуждения вернуть бронированиеRepository.save(бронирование); } Что касается класса Booking, конструктор по умолчанию пуст.
Утверждение не выполняет проверку равенства дат. Результат:
Ожидается: 06.11.2023 Актуально: 04.11.2023. 2023-11-06 — это фактическое время по Гринвичу и местному времени, когда я запускаю тест, 2023-11-04 Я не знаю почему. Я просмотрел несколько сообщений об использовании SimpleDateFormat, например, этот, но я считаю, что мой случай немного отличается, потому что мое значение даты буквально «изменилось» после прогона базы данных .
Мне нужна помощь, чтобы объяснить, почему происходит такое поведение и как я могу убедиться, что значения дат будут согласованными. Заранее спасибо.
РЕДАКТИРОВАНИЕ 1:
Проект был инициализирован с помощью Spring Initializr с Spring Boot 3.1.4 и Java 17, которые совместимы с моей системой.
Чтение/запись в базу данных обрабатывается BookingRepository, который расширяет CrudRepository и, таким образом, внедряется Spring:
публичный интерфейс BookingRepository расширяет CrudRepository { ... И я не определил никакого явного преобразования или синхронизации помимо свойств приложения:
spring.datasource.driver-class-name=org.postgresql.Driver Spring.jpa.hibernate.ddl-auto=создать-дроп Spring.datasource.url=jdbc:postgresql://localhost:5432/hotel_management Spring.datasource.username={опущено} Spring.datasource.password={опущено} РЕДАКТИРОВАНИЕ 2:
Покопавшись дальше, я обнаружил, что проблема связана с преобразованием даты, поскольку экземпляр java.sql.Date на стороне клиента анализируется до последнего значения времени по Гринвичу в 12:00. :00 утра, но сторона сервера получает то же значение, но принимает его как значение местного времени в своем экземпляре java.sql.Date, который отличается на 5 часов. После округления дата будет сдвинута на один день. Тот же процесс происходит и наоборот.
Все еще пытаюсь выяснить, как решить эту проблему, продолжая использовать java.sql.Date, поскольку переключение на другие типы данных в моем случае не очень вариант.
Я пытаюсь создать REST API с помощью Java Spring Boot и в настоящее время пишу для него тестовые примеры JUnit.
Похоже, что для объекта, содержащего экземпляр java.sql.Date, после сохранения его в базе данных и ответа возвращаемым значением save(), значение даты уже не то же самое.
После двойной проверки я действительно везде использую java.sql.Date, а не java.util.Date.
Я использую PostgreSQL и Hibernate для управления базами данных.
Вот проблемный код:
Бронирование созданоBooking = новое бронирование( новая дата(System.currentTimeMillis()), ..., // остальные аргументы для обсуждения не важны ); ResponseEntity ответ = client.postForEntity( "/createBooking", BookingDto.toDTO(createBooking), BookingDto.class); AssertEquals(HttpStatus.CREATED, response.getStatusCode()); AssertNotNull(response.getBody()); AssertEquals(createdBooking.getCheckInDate(), response.getBody().getCheckInDate()); Вот реализация контроллера:
@PostMapping(value = { "/createBooking", "/createBooking/" }) @ResponseStatus(HttpStatus.CREATED) public BookingDto createBooking(@RequestBody BookingDto bookingDto) { Бронирование бронирования = bookingService.createBooking(bookingDto); return BookingDto.toDTO(бронирование); } Вот упрощенная реализация сервиса:
public Booking createBooking(BookingDto bookingDto) { Бронирование бронирования = новое бронирование(); booking.setCheckInDate(bookingDto.getCheckInDate()); // остальные аргументы не важны для обсуждения вернуть бронированиеRepository.save(бронирование); } Что касается класса Booking, конструктор по умолчанию пуст.
Утверждение не выполняет проверку равенства дат. Результат:
Ожидается: 06.11.2023 Актуально: 04.11.2023. 2023-11-06 — это фактическое время по Гринвичу и местному времени, когда я запускаю тест, 2023-11-04 Я не знаю почему. Я просмотрел несколько сообщений об использовании SimpleDateFormat, например, этот, но я считаю, что мой случай немного отличается, потому что мое значение даты буквально «изменилось» после прогона базы данных .
Мне нужна помощь, чтобы объяснить, почему происходит такое поведение и как я могу убедиться, что значения дат будут согласованными. Заранее спасибо.
РЕДАКТИРОВАНИЕ 1:
Проект был инициализирован с помощью Spring Initializr с Spring Boot 3.1.4 и Java 17, которые совместимы с моей системой.
Чтение/запись в базу данных обрабатывается BookingRepository, который расширяет CrudRepository и, таким образом, внедряется Spring:
публичный интерфейс BookingRepository расширяет CrudRepository { ... И я не определил никакого явного преобразования или синхронизации помимо свойств приложения:
spring.datasource.driver-class-name=org.postgresql.Driver Spring.jpa.hibernate.ddl-auto=создать-дроп Spring.datasource.url=jdbc:postgresql://localhost:5432/hotel_management Spring.datasource.username={опущено} Spring.datasource.password={опущено} РЕДАКТИРОВАНИЕ 2:
Покопавшись дальше, я обнаружил, что проблема связана с преобразованием даты, поскольку экземпляр java.sql.Date на стороне клиента анализируется до последнего значения времени по Гринвичу в 12:00. :00 утра, но сторона сервера получает то же значение, но принимает его как значение местного времени в своем экземпляре java.sql.Date, который отличается на 5 часов. После округления дата будет сдвинута на один день. Тот же процесс происходит и наоборот.
Все еще пытаюсь выяснить, как решить эту проблему, продолжая использовать java.sql.Date, поскольку переключение на другие типы данных в моем случае не очень вариант.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Патч Wix меняет значение реестра обратно на исходное значение, если это значение не изменилось
Anonymous » » в форуме C# - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Патч Wix меняет значение реестра обратно на исходное значение, если это значение не изменилось
Anonymous » » в форуме C# - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Патч Wix меняет значение реестра обратно на исходное значение, если это значение не изменилось
Anonymous » » в форуме C# - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-