Оптимистическая блокировка Spring для документа MongoDB с полем java.util.Date

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

Но есть поле даты lastModified, и, кажется, я могу использовать его вот так:

@LastModifiedDate
@Version
private Date lastModified;

Но когда я пометил это поле как @Version и попытался сохранить элемент, я получил следующее исключение:

No converter found capable of converting from type [java.lang.Date] to type [java.lang.Number]

Итак, я также добавил в свою конфигурацию преобразователи Date to Number и Long to Date:

@Configuration
public class MongoConfig extends AbstractMongoConfiguration {

    ...

    @Override
    public CustomConversions customConversions() {
        return new CustomConversions(CustomConversions.StoreConversions.NONE,
            Arrays.asList(
                new DateToNumberConverter(),
                new LongToDateConverter()
        ));
    }
}

Это прекрасно работает с существующими документами. Но когда я пытаюсь добавить новый документ, я получаю:

No converter found capable of converting from type [java.lang.Integer] to type [java.util.Date]

Если я затем добавлю преобразователь целого числа в дату, то новый документ будет сохранен в базе данных, но все даты теперь будут NumberLong вместо ISODate, то есть были "lastModified" : ISODate("2018-10-02T07:30:12.005Z"), а теперь "lastModified" : NumberLong("1538465479364"). Это нарушает согласованность между существующими документами и новыми.

Итак, вопросы:

  1. Есть ли возможность использовать java.util.Date с @Version, чтобы все даты хранились как ISODate в MongoDB?
  2. Может ли кто-нибудь указать на документацию по оптимистической блокировке в Spring Data для MongoDB, кроме этого: https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo-template.optimistic-locking?
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
983
1

Ответы 1

Похоже, что в настоящее время нет возможности использовать Date в качестве поля версии, потому что оно приводится к Number внутри MongoTemplate. Я решил проблему, используя свой собственный MongoTemplate, который расширяет Spring Data MongoTemplate и переопределяет необходимые методы. К сожалению, мне пришлось скопировать и вставить много кода, потому что логика переопределения находится в частных методах.

Другие вопросы по теме