Дата выпуска весной загрузки данных покоя - PullRequest
0 голосов
/ 06 февраля 2019

У меня проблема с отдыхом данных весны при обработке дат.Вкратце, это задерживает дату на один день.Например, если у меня 1111-11-11, он возвращается ко мне 1111-11-10.

Здесь есть несколько похожих сообщений в SO ( ex1 , ex2 , ex3 ), но ни один из них не решил проблему.

У меня есть объект с этим LocalDate:

@Column(nullable=true)
private LocalDate birthDate;

У меня также есть этот репозиторий:

@RepositoryRestResource(collectionResourceRel = "person", path = "person")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long>{

}

Когда я сохраняю birthDate в базе данных (я использую MySQL), он сохраняется правильно.Однако, когда я делаю этот запрос, например:

Person p = personRepo.findById(1L).get();

Дата выбирается с опозданием на один день (как в примере выше).Я попытался реализовать это предложение , то есть изменить LocalDate на Date и включить аннотацию Джексона, но это не работает.Я также попытался включить jackson-modules-java8, но проблема все еще.

Теперь самая интригующая вещь.Поскольку я только тестировал, я включал дату 1111-11-11.Я изменил это на сегодняшнюю дату 2019-02-06.Тогда выборка работает!На этот раз, я думаю, что это была проблема с очень старыми датами.Таким образом, я попробовал, например, 1970-01-01, а весной вернулся 1969-12-31.Я понял, что если я включу в базу данных даты выше 1986-01-01, все будет работать нормально.Однако, если я добавлю что-нибудь ниже этого, я получу дату на один день позже.

Есть ли у кого-нибудь подсказка по этому вопросу?

Спасибо за ваше время!

РЕДАКТИРОВАТЬ: Я также проверил часовой пояс базы данных, и все в порядке!

+--------------------+---------------------+--------------------+
| @@GLOBAL.time_zone | @@session.time_zone | @@system_time_zone |
+--------------------+---------------------+--------------------+
| SYSTEM             | SYSTEM              | -02                |
+--------------------+---------------------+--------------------+
1 row in set (0,00 sec)

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Наконец-то я нашел решение.После @ILyaCyclone и @ OleV.V.комментарии, я начал искать о часовом поясе, весенней загрузке и LocalDate.Действительно, LocalDate не несет информацию о UTC.Однако когда я получаю эти данные из базы данных, JVM необходимо выполнить преобразование, чтобы SQL date стал LocalDate.

. Поэтому первым делом я проверил часовой пояс базы данных.:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;

, который возвратил:

+--------------------+---------------------+--------------------+
| @@GLOBAL.time_zone | @@session.time_zone | @@system_time_zone |
+--------------------+---------------------+--------------------+
| SYSTEM             | SYSTEM              | -02                |
+--------------------+---------------------+--------------------+

и:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)

возвращение:

+--------------------------------+
| TIMEDIFF(NOW(), UTC_TIMESTAMP) |
+--------------------------------+
| -02:00:00                      |
+--------------------------------+

Все эти ответы SQL были в порядке,Итак, проблема была в весенней загрузке.То, что решило проблему, было установить UTC в коде.Я нашел эту подсказку здесь .

@PostConstruct
void started() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}

После этого все даты начали работать правильно.

Решена проблема.Однако я не имею ни малейшего представления о проблеме, касающейся даты после и до 1986 года. Если у кого-то есть подсказка, пожалуйста, поделитесь со мной.

Спасибо, ребята, которые приложили некоторые усилия, чтобы помочь мне.Я действительно ценю это.

0 голосов
/ 07 февраля 2019

Использовать зависимость https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-hibernate5

Например, если вы используете Gradle

implementation ('com.fasterxml.jackson.datatype:jackson-datatype-hibernate5:2.9.8')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...